使用重复参数优化可枚举的LINQ WHERE语句

时间:2013-12-19 03:44:48

标签: c# sql linq

我有以下代码来返回在确定的日期内合同到期的所有记录:

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语句?

2 个答案:

答案 0 :(得分: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;
});

我打算走出去,说这会让你的表现大幅增加......只需要一次电话订购。

答案 1 :(得分: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;