实体框架 LINQ - 具有分组依据的子查询

Posted

技术标签:

【中文标题】实体框架 LINQ - 具有分组依据的子查询【英文标题】:Entity Framework LINQ - Subquery with Group By 【发布时间】:2010-07-26 08:30:09 【问题描述】:

我正在尝试实现一个包含子查询的查询,该子查询本身包含分组。

我的代码基于此question的答案

代码的目的是根据电子邮件地址对“人员”表执行简单的重复数据删除,并返回最新的人员行。

var innerQuery = (from p in db.Person
                              join r in db.Registration on p equals r.Person
                              join e in db.EventDetail on r.EventDetail equals e
                              where e.Client.ClientID == clientID
                              group p by p.Email into g
                              select g.Max(p => p.PersonID));

var query = (from p2 in db.Person where innerQuery.Contains(p2.PersonID) select p2);

尝试执行查询时,我收到以下错误消息:

LINQ to Entities 无法识别 方法'布尔 包含[Int32](System.Linq.IQueryable`1[System.Int32], Int32)' 方法,而该方法不能 被翻译成商店表达式。

我已经测试了内部查询,它只是按预期返回一个整数列表,但查询失败并显示上述消息。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

query 不只是加入吗?

var query = from p2 in db.Person
            join iq in innerQuery on p2.PersonID equals iq
            select p2;

我不确定= iq 部分,但我通常不使用该语法抱歉 - 以其他形式

.Join(innerQuery, p2 => p2.PersonId, iq => iq, (p2, iq) => p2);

用于连接和选择。

【讨论】:

如果调整为:from p2 in db.Person join iq in innerQuery on p2.PersonID equals iq select p2 谢谢。

以上是关于实体框架 LINQ - 具有分组依据的子查询的主要内容,如果未能解决你的问题,请参考以下文章

具有内部联接、多个分组依据和最小最大值的 Linq 查询

在实体框架和 Linq to Entities 中使用规范模式和表达式

实体框架 linq 查询 Include() 多个子实体

通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录

Sqlite,使用分组?对于具有日期范围的子查询

实体框架,LINQ 查询