如何在EF Core 3.1中使用Linq表达式与GroupBy联接
这是我的SQL查询,我在linqpad中测试了它,它工作了,但在EF Core 3.1中不工作:如何在EF Core 3.1中使用Linq表达式与GroupBy联接,linq,entity-framework-core,eager-loading,ef-core-3.1,Linq,Entity Framework Core,Eager Loading,Ef Core 3.1,这是我的SQL查询,我在linqpad中测试了它,它工作了,但在EF Core 3.1中不工作: from v in JournalVoucherLines group v by v.AccountId into vg join bp in Parties on vg.FirstOrDefault().AccountId equals bp.AccountId select new { name = bp.FullName, key = vg.Key,
from v in JournalVoucherLines
group v by v.AccountId into vg
join bp in Parties on vg.FirstOrDefault().AccountId equals bp.AccountId
select new
{
name = bp.FullName,
key = vg.Key,
Creditor = vg.Sum(v => v.Credit),
Deptor = vg.Sum(v => v.Debit),
RemainAmount = vg.Sum(v => v.Credit) - vg.Sum(v => v.Debit)
}
当我在EF Core中使用查询时,会出现以下异常:
LINQ表达式(GroupByShapeExpression:
密钥选择器:(j.AccountId),
ElementSelector:(EntityShapeExpression:
EntityType:JournalVoucherLine
ValueBufferExpression:
(ProjectionBindingExpression:EmptyProjectionMember)
IsNullable:False
)
).FirstOrDefault()“无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算。有关更多信息,请参阅。"
此查询的最佳实践是什么?首先,不要在
GroupBy
结果上使用类似FirstOrDefault()
的方法-它们不可翻译。只使用键和聚合函数(因为SQLGroupBy
运算符支持这种方法)
其次,对包含所需键/聚合的GroupBy
结果使用临时投影(Select
),然后将其连接到其他实体(表)以获取最终投影所需的附加信息
e、 g
日志行中v的
按v.AccountId将v分组到vg中
选择新建//v.Credit),
借方=总价值(v=>v.借方),
}进入vg
在vg.AccountId等于bp.AccountId//v.AccountId时加入bp的参与方)
.选择(vg=>new
{
AccountId=vg.Key,
信用=总价值(v=>v.Credit),
借方=总价值(v=>v.借方),
})
.Join(Parties,vg=>vg.AccountId,bp=>bp.AccountId,(vg,bp)=>new
{
name=bp.FullName,
key=vg.AccountId,
债权人=vg.信贷,
Deptor=vg.借方,
剩余金额=vg.贷方-vg.借方
});
但是如果你需要更多的连接,查询语法更可取。你好,Ivan,你能用LINQ方法语法编写这个查询吗?嗨@ArminShoeibi,为什么?有很多免费工具(甚至是调试视图)它可以向您显示等效的方法语法。或者您可以轻松地执行此操作,因为没有什么异常,例如,
JournalVoucherLines.GroupBy(v=>…).Select(vg=>new{…}.Join(Parties,vg=>…,p=>,(vg,p=>new{…})
等等。谢谢,我应该搜索什么工具?@Shahram,给你。但是如果你是这个意思,不,导航属性凭证
基本上是一个加入
,因此不能在分组依据
内部或之后使用-你应该在该属性的位置添加另一个手动加入,然后在分组依据
选择进入
.EF核心限制,抱歉。