无法翻译 LINQ 表达式"表达式"。要么以可翻译的形式重写查询



我看过很多类似的问题,但没有人能给我一个解决方案,所以我想如果有人能帮助我解决这个问题。我有实体的层次结构作为客户端有多个ClientRateDeals,然后我试图获取只有那些客户端有客户率交易的列表,所有通过一些条件。下面是生成错误的LINQ查询:

var query = _context.Client.Where(c=>c.Disabled==false)
.GroupJoin(_context.ClientRateDeal.Where(crd=>crd.Disabled==false),
c => c.Id,
crd => crd.ClientId,
(c, crd) => new
{
c,
crd = crd.Where(cr => cr.DateEnd == null || cr.DateEnd > DateTime.Today)
})
.Where(res =>  res.crd.Count() == 0)
.Select(cl => cl.c).AsNoTracking().ToList();

正如您在结果选择器参数中看到的那样,我保留了该条件,然后在结果选择器上保留了where子句,仅获取那些其客户端rate deal的计数为0的子句。然而,由于某种原因,我得到的例外,LINQ不能被翻译。有人能帮我一下吗?

由于未知原因(与GroupBy没有任何相似之处),EF Core 3不支持LINQGroupJoin运算符。5. x, x。

您必须使用一个可用的替代方案-(1)集合导航属性(首选)或(2)相关子查询。

(1)在Client类定义

public ICollection<ClientRateDeal> ClientRateDeals { get; set; }

并在查询

中使用它
var query = _context.Client
.Where(c => c.Disabled==false)
// vvv
.Where(c => !c.ClientRateDeals.Any(
crd => crd.Disabled == false &&
(crd.DateEnd == null || crd.DateEnd > DateTime.Today)))
.AsNoTracking().ToList();

或(2)

var query = _context.Client
.Where(c => c.Disabled==false)
// vvv
.Where(c => !_context.ClientRateDeal.Any(crd =>
c.Id == crd.ClientId &&
crd.Disabled == false &&
cr.DateEnd == null || cr.DateEnd > DateTime.Today))
.AsNoTracking().ToList();

一般来说,不用

db.As.GroupJoin(db.Bs, a => a.Id, b => b.AId, (a, Bs) => new { a, Bs })

使用

db.As.Select(a => new { a, Bs = db.Bs.Where(b => a.Id == b.AId) })

相关github问题(请投票以便有机会实现):

查询GroupBy或GroupJoin会抛出异常#17068

查询:支持GroupJoin当它是最后一个查询操作符#19930

,即使第二个不是我们所需要的(我们只想翻译GroupJoin,因为它是用上面所示的相关子查询语法编写的)。

最新更新