[英]Linq EF group by to get latest entries into list of objects
我正在尝试从简单的SQL迁移到EF。
但是,有些复杂的查询(联接)似乎很难为其生成linq。
最初,我尝试使用sqltolinq工具生成linq,但是由于查询中不支持某些内容,因此产生了错误。
这是linq:
var entryPoint = (from ep in dbContext.tbl_EntryPoint
join e in dbContext.tbl_Entry on ep.EID equals e.EID
join t in dbContext.tbl_Title on e.TID equals t.TID
where e.OwnerID == user.UID
select new {
UID = e.OwnerID,
TID = e.TID,
Title = t.Title,
EID = e.EID
});
该表条目具有许多条目,我想对其进行分组并获取每个组的最新信息。 但是然后我需要选择一个将绑定到gridview的视图模型对象。
我不知道在哪里可以实现逻辑来分组并从每个逻辑中获取最新信息,以及如何将联接表中的值获取到viewModel对象中。
我需要添加的地方
group entry by new
{
entry.aID,
entry.bCode,
entry.Date,
entry.FCode
}
into groups
select groups.OrderByDescending(p => p.ID).First()
在上面的linq中检索每个组的最新信息。
您可以在联接之后立即插入group by
:
var query =
from ep in dbContext.tbl_EntryPoint
join e in dbContext.tbl_Entry on ep.EID equals e.EID
join t in dbContext.tbl_Title on e.TID equals t.TID
where e.OwnerID == user.UID
group new { ep, e, t } by new { e.aID, e.bCode, e.Date, e.FCode } into g
let r = g.OrderByDescending(x => x.e.ID).FirstOrDefault()
select new
{
UID = r.e.OwnerID,
TID = r.e.TID,
Title = r.t.Title,
EID = r.e.EID
};
这里的技巧是在group
和by
之间进行分组之后包括您需要by
。
但是,以上内容将转换为CROSS APPLY
并且所有联接都包含两次。 如果分组键仅包含一个表中的字段,则最好先执行分组/选择最后一个分组元素,然后将结果与其余的联接:
var query =
from e in (from e in dbContext.tbl_Entry
where e.OwnerID == user.UID
group e by new { e.aID, e.bCode, e.Date, e.FCode } into g
select g.OrderByDescending(e => e.ID).FirstOrDefault())
join ep in dbContext.tbl_EntryPoint on e.EID equals ep.EID
join t in dbContext.tbl_Title on e.TID equals t.TID
select new
{
UID = e.OwnerID,
TID = e.TID,
Title = t.Title,
EID = e.EID
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.