c# linq with group by and join 抛出异常

Posted

技术标签:

【中文标题】c# linq with group by and join 抛出异常【英文标题】:c# linq with group by and join throwing exception 【发布时间】:2020-08-13 13:38:18 【问题描述】:
(from p in this.m_dbContext.Patient
        join b in (from a in this.m_dbContext.Appointments
        join p in this.m_dbContext.Patient on a.Patientid equals 
        p.Patientid
        where a.Doctorid == doctorid && a.Clinicid == clinicid
        group a by a.Patientid)
        on p.Patientid equals b.FirstOrDefault().Patientid
        orderby p.Name
        select new
        
          p.Patientid,
          p.Clinicid,
          p.Name,
          p.Mobilenumber,
          p.Gender,
          p.Dob,
          p.Age,
          p.Address,
          p.City,
          p.State,
          p.Pincode
       ).ToList().Count();

运行时出现以下异常,我使用 group by 来删除结果集中的重复项

例外:

无法翻译 LINQ 表达式“FirstOrDefault(GroupByShaperExpression: KeySelector: a.patientid, ElementSelector:EntityShaperExpression: EntityType: Appointments ValueBufferExpression: ProjectionBindingExpression: EmptyProjectionMember IsNullable: False)”。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

【问题讨论】:

是的,你确实得到了那个例外。你的问题是什么?请记住,我们不知道您了解或不了解正在发生的事情。让我们知道您了解多少以及在哪里需要帮助。异常本身就一种潜在的解决方法(切换到客户评估)提供了建议,这是一种可接受的解决方法吗?请写一个完整的问题,并附上我们回答所需的所有细节。 是否有使用 FirstOrDefault 的特定原因?您确定不需要其他患者记录吗? 【参考方案1】:

也许你的 groupby 可以改变来克服这个障碍。将 GroupBy linq 查询转换为适当的 sql 查询的复杂性仍然是 dotnetcore 的一个持续开发问题。

编辑: 我在 Github 上看到一个已关闭的问题:Query with GroupBy or GroupJoin throws exception #17068 但我不确定他们是否仍在解决 GroupBy 问题,或者它是否已修复,或者他们是否不会对此采取任何措施。

也许您可以将查询更改为以下内容: 请注意,我在计数之前删除了.ToList(),因为如果您只需要计数,这对我来说似乎有点矫枉过正。

var patientIds = (from a in this.m_dbContext.Appointments
                  join p in this.m_dbContext.Patient on a.Patientid equals p.Patientid
                  where a.Doctorid == doctorid && a.Clinicid == clinicid
                  select a.Patientid).Distinct();

var items = (from p in this.m_dbContext.Patient
             join patientId in patientIds on p.Patientid equals patientId
             orderby p.Name
             select new
             
                 p.Patientid,
                 p.Clinicid,
                 p.Name,
                 p.Mobilenumber,
                 p.Gender,
                 p.Dob,
                 p.Age,
                 p.Address,
                 p.City,
                 p.State,
                 p.Pincode
             ).ToList();

或者,如果您只需要计数:

var count = (from p in this.m_dbContext.Patient
             join patientId in patientIds on p.Patientid equals patientId
             orderby p.Name
             select new
             
                 p.Patientid
             ).Count();

【讨论】:

以上是关于c# linq with group by and join 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

C# Linq group by 和 group by into 运用实例

.NET(C#) System.Linq中实现多列group by(分组)的示例代码

C# Linq Group By 在多列上[重复]

C# Linq to SQL — Group by

如何通过 join 和 group by 在 C# Linq 中获取 Min?

c# Linq select join on select group by