我正试图从简单的SQL转向EF。
但是有一些复杂的查询(连接)似乎很难生成linq for。
起初我尝试使用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中从每个组中检索最新的。
答案 0 :(得分:2)
您可以在加入后立即插入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
之间分组后包含您需要的内容。
但是,上述内容将被翻译为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
};