Linq查询w / sub查询和最大值

时间:2015-05-22 19:36:51

标签: c# linq

如何将此SQL重写为Linq查询?

普通SQL

from c in _db.Contracts
join sub in (from cl in _db.ContractLogs
             group cl by cl.contractId into g
             select new { contractId = g.contractId, changedate = g.Max(x => x.date)})
    on c.id equals sub.contractId 
select new { c, cl }

尝试Linq

=IF(ISNUMBER(MATCH(A1,B:B,0)),"Its there","no happiness")

查询的目标是选择所有具有最新更新的合同(第一个)(在contractLogs中)。我目前难以理解选择是如何工作的。理想情况下,我正在尝试使用c& CL。

4 个答案:

答案 0 :(得分:1)

您可以按降序排序并获取第一个日志来获取最新日志:

from c in _db.Contracts
let mostRecentContractLog = c.ContractLogs
                             .OrderByDescending(cl => cl.date)
                             .FirstOrDefault()
select new { c, mostRecentContractLog }

如您所见,我假设您有一个导航属性Contract.ContractLogs。强烈建议使用导航属性而不是手动编码的连接。

答案 1 :(得分:0)

在这种情况下,分别编写查询和子查询通常更容易:

var subQuery =
    from cl in _db.ContractLogs
    group cl by cl.contractId into g
    select new { contractId = g.Key, date = g.Max(cl => cl.date) };

var query =
    from c in _db.Contracts
    join cl in subQuery on c.contractId equals cl.contractId
    select new { contract = c, cl.date };

答案 2 :(得分:0)

最直接的翻译将涉及您在ContractLogs上调用groupby,然后将其加入Contacts。我认为你的LINQ尝试中的操作顺序有点偏,但我不经常使用查询语法,所以我对此并不乐观。无论如何,我认为你更喜欢这样的事情;

_db.ContractLogs.GroupBy(x => x.contractId).Select(x => new { contractid = x.Key, changedate = x.Max(y => y.date) })

有了这个你可以加入到_db.Contracts中,但是我认为你可以更简单地用它来编写它,尽管LINQ to SQL提供程序可能不太优化。无论如何,只需用连接完成示例;

OldQuery.Join(_db.Contracts, cl => cl.contractid,
              c => c.contractid, (cl, c) => cl);

答案 3 :(得分:0)

你可以试试这个:

from c in _db.Contracts
select new 
{ 
   c, 
   cl = _db.ContractLogs.Where(l => l.contractId == c.contractId).OrderByDescending(l => l.date).FirstOrDefault() 
}