无法翻译 LINQ 表达式 'Expression'。要么以可以翻译的形式重写查询
The LINQ expression 'Expression' could not be translated. Either rewrite the query in a form that can be translated
我看过很多类似的问题,但 none 可以给我一个解决方案,所以我在想是否有人可以帮助我解决这个问题。我有一个实体层次结构,因为客户有多个 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 子句,以仅获取那些客户费率交易计数为 0 的客户。但是由于某种原因,我得到了无法翻译 LINQ 的异常。谁能帮我解决这个问题?
由于未知原因(它与 GroupBy
没有任何相似之处),EF Core 3.x、5.x.[=21 不支持 LINQ GroupJoin
运算符=]
您必须使用可用的替代方法之一 - (1) 集合导航 属性(首选)或 (2) 相关子查询。
例如
(1) 在Client
class 中定义
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 问题(请投票以便有机会实施):
Query with GroupBy or GroupJoin throws exception #17068
Query: Support GroupJoin when it is final query operator #19930
尽管第二个并不是我们所需要的(我们只想翻译 GroupJoin
,因为它是用上面显示的相关子查询语法编写的)。
我看过很多类似的问题,但 none 可以给我一个解决方案,所以我在想是否有人可以帮助我解决这个问题。我有一个实体层次结构,因为客户有多个 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 子句,以仅获取那些客户费率交易计数为 0 的客户。但是由于某种原因,我得到了无法翻译 LINQ 的异常。谁能帮我解决这个问题?
由于未知原因(它与 GroupBy
没有任何相似之处),EF Core 3.x、5.x.[=21 不支持 LINQ GroupJoin
运算符=]
您必须使用可用的替代方法之一 - (1) 集合导航 属性(首选)或 (2) 相关子查询。
例如
(1) 在Client
class 中定义
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 问题(请投票以便有机会实施):
Query with GroupBy or GroupJoin throws exception #17068
Query: Support GroupJoin when it is final query operator #19930
尽管第二个并不是我们所需要的(我们只想翻译 GroupJoin
,因为它是用上面显示的相关子查询语法编写的)。