内含清单的.NET查询无法翻译

时间:2020-09-14 14:50:40

标签: c# .net .net-core-3.1

我在执行涉及查询中的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();

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

LINQ表达式...无法翻译。

如果我删除此行:

&& 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类型的。

1 个答案:

答案 0 :(得分:1)

您正在使用实体框架或其他一些orm。它将尝试将查询转换为某些sql语法。

我可以看到您正在尝试在此行中进行 p.Cor.Tom == t运算。 因此Tom是一个复杂的类型。而且,您无法在IQueryable查询中比较复杂的类型。因为根本不知道如何比较您的自定义类。

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

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

而且,您可能还需要创建一个带有实用的tonsFavoritos的主键列表。 会像这样:

     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)

您的其他任何查询运行的原因是因为不在内存集合中。它是“ Categorias”表的副本。并不是内存中的实际集合。