.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 的复制品。不是真正的内存中的实际集合。
我在执行涉及查询中的 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 的复制品。不是真正的内存中的实际集合。