我有一个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
如果Query
A
或B
已经被执行了,我的意思是ToList()
已经被执行了,无论如何我都没有问题。但是在我的例子中,两个查询都没有被执行,因此使用这个函数会导致。
无法转换System.InvalidOperationException
查询
另一种方法是使用GroupBy
,但是我不知道如何用GroupBy
替换UnionBy
行为
仅供参考:使用IQueryable.Union
时,查询可以完美地工作,在我的示例中,请求必须保留在IQueryable
中,直到稍后才执行
更新
我️所寻找的解决方案必须停留在IQueryable
中,而不执行toList()
2条答案
按热度按时间kmb7vmvb1#
“query could not be translate”通常意味着EF不支持某个LINQ或语言结构,因为它无法将其转换为SQL。实现这一点的一种方法是在执行
UnionBy
:kqlmhetl2#
解决方法很简单,您可以使用以下公式从B中过滤A