.NET Query With list inside 无法翻译

.NET Query With list inside can not translate

我在执行涉及查询中的 ENUMS 列表的查询时遇到问题,我记得在 .NET 2.2 中执行过类似的查询,但不记得遇到过问题。所以这是我目前的查询:

        string[] motivosCompra = dadosConsultoria.MotivosCompra.Split(",");
        List<TipoCor> tonsFavoritos = _colorsService.ConverterFromListString(dadosConsultoria.CoresFavoritas.Split(","));

        return _context.Produtos
            .Include(c => c.Cor)                
            .Include(d => d.DadoEmpresa)               
            .Include(i => i.Imagens)               
            .Include(p => p.Peca)               
            .Include(e => e.EstilosProduto)
            .ThenInclude(c => c.EstiloProduto)
            .Include(c => c.Categorias)
            .ThenInclude(c => c.Categoria)
            .Where(p => p.Ativo                    
                && p.DadoEmpresa.Id == IdEmpresa
                && p.Peca.Id == tipoDePeca.Id
                && p.Categorias.Any(c => motivosCompra.Any(m => m == c.Categoria.Nome))
                && p.EstilosProduto.Any(e => e.EstiloProduto.Nome == estiloNome)
                && tonsFavoritos.Any(t => p.Cor.Tom == t) 
                && p.Cor.Temperatura == temperatura)                
            .Take(5)
            .ToList();

当我尝试这样做时,我得到:

The LINQ expression ... could not be translated.

如果我删除这一行:

&& tonsFavoritos.Any(t => p.Cor.Tom == t) 

它工作正常。

在查询中对列表使用 Any 有问题吗?它对我来说很奇怪,因为另一个我使用接缝工作正常,在:

&& p.Categorias.Any(c => motivosCompra.Any(m => m == c.Categoria.Nome))

编辑:

TipoCor的定义:

public enum TipoCor
{
    [Display(Name = "Neutras")]
    Neutras = 0,
    [Display(Name = "Terrosas")]
    Terrosas = 1,
    [Display(Name = "Pasteis")]
    Pasteis = 2,
    [Display(Name = "Suaves")]
    Suaves = 3,
    [Display(Name = "Vivas")]
    Vivas = 4,
    [Display(Name = "Escuras")]
    Escuras = 5
}

Tom 属于 TipoCor 类型。

您正在使用 entity framework 或其他格式。它试图将您的查询翻译成一些 sql 语法。

而且我可以看到您正试图在这一行中制作一个等式 p.Cor.Tom == t。 所以 Tom 是一个复杂类型。而且您无法在 IQueryable 查询中比较复杂类型。因为它根本不知道如何比较您的自定义 class.

基本上您可以做的是尝试比较您的 classes 的主要或唯一 ID。喜欢:

tonsFavoritos.Any(t => p.Cor.Tom.Id == t.Id) 

而且您可能还需要创建一个主键列表,其中包含 tonsFavoritos veriable。 会像:

     int[] tonsFavoritos = _colorsService.ConverterFromListString(dadosConsultoria.CoresFavoritas.Split(",")).Select(c=> c.Id).ToArray();

     //and then edit query like below:
     tonsFavoritos.Contains(t => p.Cor.Tom.Id) 

因此,通过这种方式,orm 工具只需将此查询转换为

select * from CARS where CAR.Id in (1,2,3,4,5)

您的其他 Any 查询之所以有效,是因为它不在内存集合中。它是“Categorias”table 的复制品。不是真正的内存中的实际集合。