Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在EF Core 3.1中使用Linq表达式与GroupBy联接_Linq_Entity Framework Core_Eager Loading_Ef Core 3.1 - Fatal编程技术网

如何在EF Core 3.1中使用Linq表达式与GroupBy联接

如何在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,

这是我的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,
    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()
的方法-它们不可翻译。只使用键和聚合函数(因为SQL
GroupBy
运算符支持这种方法)

其次,对包含所需键/聚合的
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核心限制,抱歉。