我使用的是实体框架。我想从具有多个关联的IQueryable
中获取ID,并且每个关联的IQueryable都有最后更新的时间戳。我只想在所有上次更新的时间戳的最大值(DateTime
-不可为null(大于给定日期时获得ID。在Oracle中,我会使用GREATEST
函数。
我有一个解决方案,但正在寻找更优雅的解决方案。我尝试了将SelectMany
与Where
函数结合使用,但我认为它不适用于这种情况。这是我的解决方案:
public IQueryable<int> GetAllContractIdsWithChanges(MyDb context, DateTime lastTimeChecked)
{
return context.Contracts.Where(c => c.GetGreatestLastUpdateTs() >= lastTimeChecked).Select(c=>c.ContractId);
}
public static DateTime GetGreatestLastUpdateTs(this Contract c)
{
return new DateTime[]
{
c.LST_UPDT_TS,
c.ContractSection1.Max(a => a.LST_UPDT_TS),
c.ContractSection2.Max(a => a.LST_UPDT_TS),
c.ContractSection3.Max(a => a.LST_UPDT_TS),
c.ContractSection4.Max(a => a.LST_UPDT_TS),
c.ContractSection5.Max(a => a.LST_UPDT_TS)
}.Max();
}
我想知道C#/Linq是否有内置的东西可以自然地做到这一点。-谢谢
在Oracle中,我会使用GREATEST函数。
我建议您创建一个存储过程来完成繁重的工作,而不是将其与Linq/EF拼接在一起;因为可以用EF调用存储过程。
参见
SQL Server是否支持GREATST和LEAST,如果不支持,常见的解决方法是什么?
使用实体框架执行存储过程