C# &引用;或;使用Linq对实体进行按需访问,我如何做到这一点?
我有以下按需执行“和”的查询:C# &引用;或;使用Linq对实体进行按需访问,我如何做到这一点?,c#,linq,C#,Linq,我有以下按需执行“和”的查询: var products = // Selecting a list of products in anywhere based in a filter... foreach (var product in products) { query = query.Where(p => p.Code == product.Code); // with this way, this query make no sense because this happ
var products = // Selecting a list of products in anywhere based in a filter...
foreach (var product in products)
{
query = query.Where(p => p.Code == product.Code); // with this way, this query make no sense because this happens in any scenario, never a code can be more than one code.
}
那么,如何执行相同的查询,但执行“或”按需查询(以便查询有意义)?使用:
您可以在中为LINQ使用
的传真:
var productCodeList = products.Select(p => p.Code).ToList();
query = query.Where(p => productCodeList.Contains(p.Code));
基本上是说:
SELECT *
FROM products
WHERE code IN (<list_of_codes>)
选择*
来自产品
其中代码位于()
使用Brad和Joe编写的Contains
方法,或者(如果不可能)使用
var predicate=PredicateBuilder.False();
foreach(产品中的var产品)
{
var代码=产品代码;
谓词=谓词或(p=>p.Code==Code);
}
var products dataContext.products.Where(谓词);
我遇到以下错误:无法创建“MyEntities.Product”类型的常量值。在此上下文中仅支持基本类型(“如Int32、字符串和Guid”)。
什么是Product.code
?上课?不。prolem(我猜)是当您在where中执行Select-in产品时,linq尝试使用类产品来执行查询。所以,要解决这个问题,你必须执行产品。选择像@BradChristie在他的答案中所做的那样。PredicateBuilder为+1,尽管我更喜欢Pete Montgomery的版本-
SELECT *
FROM products
WHERE code IN (<list_of_codes>)
var predicate = PredicateBuilder.False<Product>();
foreach (var product in products)
{
var code = product.Code;
predicate = predicate.Or(p => p.Code == code);
}
var products dataContext.Products.Where(predicate);