我有以下代码来返回在确定的日期内合同到期的所有记录:
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语句?
答案 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;