C# Linq EF group by以获取对象列表中的最新条目
我正在尝试从简单的SQL迁移到EF 但有些复杂的查询(连接)似乎很难为其生成linq 起初,我尝试使用sqltolinq工具生成linq,但它给出了错误,因为查询中不支持某些内容 以下是linq:C# Linq EF group by以获取对象列表中的最新条目,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我正在尝试从简单的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
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中,您可以从每个组中检索最新的组。您可以在联接后立即插入
groupby
:
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
之间分组后包含所需内容
但是,上述内容将被转换为交叉应用
,包括两次所有连接。如果分组键仅包含一个表中的字段,则最好先执行分组/选择最后一个分组元素,然后将结果与其余元素联接:
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
};
非常感谢。你是明星@Ivan。。这很好用。不过,这只是另一个简单的问题。如果要在中添加逻辑,请选择新属性,例如UID=e.ownerID+RanddomNumber()。我猜这在这里是不允许的,因为查询是针对数据库运行的。但是实现这一点最有效的方法是什么呢?你是对的-EF不支持无法转换为SQL的函数。但是您可以总是说
query.AsEnumerable().Select(e=>new{…})
并在newSelect
中放入您喜欢的内容,因为其余内容将在LINQ to Objects上下文中执行,其中支持编译的所有内容。