我正在尝试从数据库中检索名称包含的产品列表,以我作为参数传递给执行查询的方法的任何列表元素开始或结束。
我已经尝试了两种 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 而不是 Contains、StartsWith 或 EndsWith 时,完全相同的查询有效。 我搜索了很多,找到了很多资源,但没有适合我的解决方案。 这里有两个相关的 Stack overflow 问题,其中 Jon skeet 推荐相同的实现。
我使用的是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。