linq UnionBy()EF核心

irlmq6kh  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(200)

我有一个ef查询,它给予了以下结果

IQueryable<A>
| Id      | count |
| 1       | 5     |
| 2       | 6     |

IQueryable<B>
| Id      | count |
| 1       | 1     |
| 2       | 2     |
| 3       | 9     |

当我这样做

IQueryable<Something> C = A.union(B)

我得到的结果是

| Id      | count |
| 1       | 5     |
| 2       | 6     |
| 1       | 1     |
| 2       | 2     |
| 3       | 9     |

Whish是合乎逻辑的。
我想要的是一个UnionBy(Id)

IQueryable<Something> C = A.unionBy(B,c=>c.Id)

这对我来说非常有效

| Id      | count |
| 1       | 5     |  -- FROM A
| 2       | 6     |  -- FROM A
| 3       | 9     |  -- FROM B

如果QueryAB已经被执行了,我的意思是ToList()已经被执行了,无论如何我都没有问题。但是在我的例子中,两个查询都没有被执行,因此使用这个函数会导致。
无法转换System.InvalidOperationException查询
另一种方法是使用GroupBy,但是我不知道如何用GroupBy替换UnionBy行为
仅供参考:使用IQueryable.Union时,查询可以完美地工作,在我的示例中,请求必须保留在IQueryable中,直到稍后才执行

更新

我️所寻找的解决方案必须停留在IQueryable中,而不执行toList()

kmb7vmvb

kmb7vmvb1#

“query could not be translate”通常意味着EF不支持某个LINQ或语言结构,因为它无法将其转换为SQL。实现这一点的一种方法是在执行UnionBy

IQueryable<Something> C = A.ToList().UnionBy(B.ToList(),c=>c.Id);
kqlmhetl

kqlmhetl2#

解决方法很简单,您可以使用以下公式从B中过滤A

IQueryable<Something> C = A.Union(B.where(b=> A.All(a=>a.Id != b.Id))

相关问题