0

I have the following Linq query:

from workItem in WorkItem
    join workItemHistory in WorkItemHistory on workItem equals workItemHistory.WorkItem
    join ivSweepHistory in IVSweepHistory on workItemHistory equals ivSweepHistory.WorkItemHistory
    where workItem.SerialNumber == "080106081985"
    orderby ivSweepHistory.ReadTime descending
select ivSweepHistory

As is, this works great. However, I want to modify this so that I only retrieve the first row instead of all rows. How would I do this?

Thanks.

Randy Minder
  • 47,200
  • 49
  • 204
  • 358
  • For those curious between the difference between `.First` (and `.FirstOrDefault`) and `.Take(x)`, see http://stackoverflow.com/questions/1024559/when-to-use-first-and-when-to-use-firstordefault-with-linq/1024577#1024577 – Chad Levy Jun 15 '10 at 19:47

4 Answers4

6
var item = (from workItem in WorkItem 
            join workItemHistory in WorkItemHistory on workItem equals workItemHistory.WorkItem 
            join ivSweepHistory in IVSweepHistory on workItemHistory equals ivSweepHistory.WorkItemHistory 
            where workItem.SerialNumber == "080106081985" 
            orderby ivSweepHistory.ReadTime descending 
            select ivSweepHistory).first();
moi_meme
  • 9,180
  • 4
  • 44
  • 63
4

Simply use the First() method:

var query = // your query;
var result = query.First();

If there's a possibility of no results being returned use FirstOrDefault() instead to avoid an exception from being thrown.

Ahmad Mageed
  • 94,561
  • 19
  • 163
  • 174
2

Enclose it in Take.

(from workItem in WorkItem
    join workItemHistory in WorkItemHistory on workItem equals workItemHistory.WorkItem
    join ivSweepHistory in IVSweepHistory on workItemHistory equals ivSweepHistory.WorkItemHistory
    where workItem.SerialNumber == "080106081985"
    orderby ivSweepHistory.ReadTime descending
select ivSweepHistory)Take(1)
Raj Kaimal
  • 8,304
  • 27
  • 18
2
var allResults = from workItem in WorkItem
    join workItemHistory in WorkItemHistory on workItem 
        equals workItemHistory.WorkItem
    join ivSweepHistory in IVSweepHistory on workItemHistory 
        equals ivSweepHistory.WorkItemHistory
    where workItem.SerialNumber == "080106081985"
    orderby ivSweepHistory.ReadTime descending
select ivSweepHistory

var first = allResults.FirstOrDefault();

Or

(from workItem in WorkItem
    join workItemHistory in WorkItemHistory on workItem 
        equals workItemHistory.WorkItem
    join ivSweepHistory in IVSweepHistory on workItemHistory 
        equals ivSweepHistory.WorkItemHistory
    where workItem.SerialNumber == "080106081985"
    orderby ivSweepHistory.ReadTime descending
select ivSweepHistory).FirstOrDefault();

You could also use First(), but if the query fails to return any results, First() will throw an Exception whereas FirstOrDefault() will handle the condition gracefully.

Justin Niessner
  • 242,243
  • 40
  • 408
  • 536