2015-05-27 55 views
0

我正在學習LINQ,並試圖弄清楚如何讓所有成員的最後一個訂單失敗(每個成員可以有很多訂單)。出於效率的原因,如果可能的話,我希望在將它放入列表之前在LINQ中完成。LINQ:獲取最後訂單的所有成員失敗

到目前爲止,我認爲這是讓最近加入失敗訂單的所有成員(cutoffDate是當前日期-10天)的正確方法。

var failedOrders = 
from m in context.Members 
from o in context.Orders 
where m.DateJoined > cutoffDate 
where o.Status == Failed 
select m; 

我希望我需要使用最後或LastOrDefault,或者可能我需要使用

orderby o.OrderNumber descending 

,然後拿到第一或FirstOrDefault在this計算器答案建議。

請注意,我只想查看給定成員的最後訂單,看看是否失敗(不只是查找最後失敗的訂單)。

回答

1

通常你會寫是這樣的:如果有Members.Orders關係

var failedOrders = from m in context.Members 
        where m.DateJoined > cutoffDate 
        select new 
        { 
         Member = m, 
         LastOrder = m.Orders.OrderByDescending(x => x.OrderNumber).FirstOrDefault() 
        } into mlo 
        // no need for null checks here, because the query is done db-side 
        where mlo.LastOrder.Status == Failed 
        select mlo; // or select mlo.Member to have only the member 

+0

是有關係,每個訂單都有一個成員的引用,每一個成員都有名單所有的訂單(抱歉,但我的數據庫術語有點生疏)。 – Tarostar

+0

從我最初的測試來看,這似乎工作得非常好,並且讓我走上了探索SELECT INTO的道路,因爲這看起來非常有用。任何重大的性能或資源使用懲罰我應該注意以這種方式創建一個臨時變量? – Tarostar

+1

@Tarostar你沒有創建一個臨時變量。您可以通過查看'failedOrders'變量來查看Visual Studio中生成的查詢。它將是一個嵌套查詢(SELECT的SELECT)。如果你不需要最後的命令(所以你做一個'select mlo.Member'),可以刪除'select new ... into'並直接移動'm.Orders ... FirstOrDefault()'在哪裏。性能可能相同。 – xanatos