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

The LINQ expression #39;Expression#39; could not be translated. Either rewrite the query in a form that can be translated(无法翻译LINQ表达式。以可以翻译的形式重写查询)
本文介绍了无法翻译LINQ表达式。以可以翻译的形式重写查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看过很多类似的问题,但没有一个能给我一个解决方案,所以我在想是否有人能帮我解决这个问题。我有一个实体层次结构,因为客户端有多个ClientRateDeal,然后我尝试只提取那些具有全部通过某些条件的客户端费率交易列表的客户端。下面是我生成错误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不支持LINQGroupJoin运算符。

您必须使用可用备选方案之一-(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相关问题(请前往投票以便有机会实施):

Query with GroupBy or GroupJoin throws exception #17068

Query: Support GroupJoin when it is final query operator #19930

尽管第二个并不完全是我们需要的(我们只希望翻译GroupJoin,因为它是用上面显示的相关子查询语法编写的)。

这篇关于无法翻译LINQ表达式。以可以翻译的形式重写查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)