在 Entity Framework 中查找多个 OR 参数

Find in Entity Framework multiple OR parameters

假设我的数据库中有一个描述为“50 号白衬衫”的产品。

搜索参数为“shirt 50”。我有一个更复杂的查询,我在其中添加了几个“OR”,但我无法使它们起作用。

我收到以下错误:

The LINQ expression

'DbSet() .Where(p => p.IdTienda == __request_IdTienda_0) .Join( inner: DbSet(), outerKeySelector: p => p.IdArticulo, innerKeySelector: a => a.Id, resultSelector: (p, a) => new TransparentIdentifier<Publicacion, Articulo>( Outer = p, Inner = a )) .Where(ti => __arrayrequest_1 .Any(s => ti.Outer.Descripcion.Contains(s)) || ti.Outer.Codigo == __request_Filtro_SearchText_2 || ti.Inner.Codigo == __request_Filtro_SearchText_2 || ti.Inner.CodigoUniversal == __request_Filtro_SearchText_2 || ti.Inner.CodigoUniversalBulto == __request_Filtro_SearchText_2)'

could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

到目前为止我的代码如下:

var arrayrequest = request.Filtro.SearchText.Split().ToList();

var query = from publicacion in _dbContext.Publicaciones.Where(p => p.IdTienda == request.IdTienda)
            join articulo in _dbContext.Articulos 
                 on publicacion.IdArticulo equals articulo.Id
            where
                arrayrequest.Any(s => publicacion.Descripcion.Contains(s))
                                 || publicacion.Codigo == request.Filtro.SearchText
                                 || articulo.Codigo == request.Filtro.SearchText
                                 || articulo.CodigoUniversal == request.Filtro.SearchText
                                 || articulo.CodigoUniversalBulto == request.Filtro.SearchText
            select publicacion;

var publicaciones = await query
                          .Include(p => p.Articulo)
                          .Include(p => p.TributoPublicacion)
                          .ToArrayAsync();

错误发生在

部分
arrayrequest.Any(s => publicacion.Descripcion.Contains(s))`

我使用 Entity Framework Core 5 - 欢迎任何帮助

不想重复自己,但最好能说明如何解决。

EF 不支持本地集合的复杂谓词,在这里您需要动态构建表达式树。此答案具有 功能,可帮助构建所需条件。

然后你可以这样重写你的查询:

var arrayrequest = request.Filtro.SearchText.Split().ToList();

var query = from publicacion in _dbContext.Publicaciones.Where(p => p.IdTienda == request.IdTienda)
            join articulo in _dbContext.Articulos 
                 on publicacion.IdArticulo equals articulo.Id
            select publicacion;
            
var descriptionPredicate = query.GetItemsPredicate(arrayrequest, (publicacion, s) => publicacion.Descripcion.Contains(s));

Expression<Func<Publicacion, bool>> otherPredicate = publicacion => publicacion.Codigo == request.Filtro.SearchText
                                 || articulo.Codigo == request.Filtro.SearchText
                                 || articulo.CodigoUniversal == request.Filtro.SearchText
                                 || articulo.CodigoUniversalBulto == request.Filtro.SearchText;

query = query.Where(descriptionPredicate.CombineOr(otherPredicate)));

var publicaciones = await query
    .Include(p => p.Articulo)
    .Include(p => p.TributoPublicacion)
    .ToArrayAsync();