假設我的資料庫中有一個產品描述為“白襯衫尺寸 50”。
搜索引數將是“shirt 50”。我有一個更復雜的查詢,我在其中添加了幾個“OR”,但我無法讓它們作業。
我收到以下錯誤:
LINQ 運算式
'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.Descriptcion.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)'
無法翻譯。以可翻譯的形式重寫查詢,或通過插入對“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的呼叫顯式切換到客戶端評估。有關詳細資訊,請參閱https://go.microsoft.com/fwlink/?linkid=2101038。
到目前為止,我的代碼如下:
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 - 歡迎任何幫助
uj5u.com熱心網友回復:
不想重復自己,但最好展示一下如何解決它。
EF 不支持帶有本地集合的復雜謂詞,在這里您需要動態構建運算式樹。此答案具有GetItemsPredicate功能,有助于建立所需的條件。
然后你可以用這種方式重寫你的查詢:
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();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427142.html
