检查数据库列是否包含、开始或结束于 EF 查询的 where 子句内的任何列表项不起作用

问题描述 投票:0回答:0

我正在尝试从数据库中检索名称包含的产品列表,以我作为参数传递给执行查询的方法的任何列表元素开始或结束。

我已经尝试了两种 linq 方法(方法和查询语法)

这是 Linq 方法查询的相关代码,名称是作为参数传递给方法的名称列表:

var query =  _dbContext.Products.Where(p => p.IdSemProduitAgreo == null && names.Any(name => p.Libelle.Contains(name))).Select(item => new ProductEntity() { Uuid = item.Uuid, Code = item.Code});

var query =  _dbContext.Products.Where(p => p.IdExternalProduct == null && names.Any(name => p.Libelle.StartsWith(name))).Select(item => new ProductEntity() { Uuid = item.Uuid, Code = item.Code});

这是查询语法方法

IQueryable<ProductEntity> query = (
                        from p in _dbContext.Products
                        where 
                            p.IdExternalProduct == null &&
                            (names != null && names.Count > 0 ? names.Any(name => p.Libelle.Contains(name)) : true)
                        select new ProductEntity()
                        {
                          Uuid = p.Uuid,
                          Code = p.Code
                        }

当我尝试使用 Equals 而不是 ContainsStartsWithEndsWith 时,完全相同的查询有效。 我搜索了很多,找到了很多资源,但没有适合我的解决方案。 这里有两个相关的 Stack overflow 问题,其中 Jon skeet 推荐相同的实现。

检查列表中的字符串是否包含具有 Linq 的特定字符串

正确的 LINQ where 子句

我使用的是6.0.10版本的entity framework和sqlServer provider。

但是好像无法翻译这些公式,抛出异常并显示以下消息。

LINQ 表达式 'name => EntityShaperExpression: Agreo.Service.Product.SemProduit 值缓冲区表达式: ProjectionBindingExpression:EmptyProjectionMember 可空:假 .Libelle.Contains(name)' 无法翻译。以可以翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

c# sql-server database entity-framework .net-core
© www.soinside.com 2019 - 2024. All rights reserved.