2013-12-19 18 views
0

聲明我有下面的代碼返回已在確定的天合同到期的所有記錄:瑞風可枚舉LINQ WHERE反覆參數

return pSource 
       .Where(q => 
        q.StaffContracts.OrderByDescending(p => p.SignedDate).FirstOrDefault().Timespan.HasValue && 
        q.StaffContracts.OrderByDescending(p => p.SignedDate).FirstOrDefault().SignedDate.HasValue && 
        (q.StaffContracts.OrderByDescending(p => p.SignedDate).FirstOrDefault().SignedDate.Value.AddMonths(q.StaffContracts.OrderByDescending(p => p.SignedDate).FirstOrDefault().Timespan.Value) 
        - now).TotalDays <= value); 

正如你所看到的,重複q.StaffContracts.OrderByDescending(p => p.SignedDate).FirstOrDefault()多次。有沒有辦法縮短這個陳述?它的等價SQL語句是什麼?

回答

1

這樣做怎麼樣?

return 
    from q in pSource 
    let sc = q.StaffContracts 
     .OrderByDescending(p => p.SignedDate) 
     .FirstOrDefault() 
    where sc != null 
    let ts = sc.Timespan 
    let sd = sc.SignedDate 
    where ts.HasValue 
    where sd.HasValue 
    where (sd.Value.AddMonths(ts.Value) - now).TotalDays <= value 
    select q; 
1

你可以把它變成一個方法體..它返回bool。可能不是一個壞主意,檢查null太:

return pSource.Where(q => { 
    var contract = q.StaffContracts.OrderByDescending(p => p.SignedDate).FirstOrDefault(); 

    if (contract == null) 
     return false; // returns nothing 

    return contract.Timespan.HasValue && 
      contract.SignedDate.HasValue && 
      (contract.SignedDate.Value.AddMonths(contract.Timespan.Value) - now) 
      .TotalDays <= value; 
}); 

我要去無路可退,並說這將大量增加你的表現..只有一個順序呼叫。

+0

謝謝,我在lambda操作中收到語法錯誤:'帶有語句正文的lambda表達式不能轉換爲表達式樹。我該如何解決這個問題?對不起,我是LINQ的新手。 –

+0

啊。這是一個問題。 LINQ不是直接的SQL技術,它被ORM使用,例如LINQ-to-SQL,Entity Framework,NHibernate等來創建SQL。它通過訪問lambda表達式中的每個節點來生成SQL。我給你的是LINQ ..但它不是一個lambda表達式..它是一個完整的方法體。不幸的是,這將無法轉換爲SQL。 –