有没有更好的方法来处理这个问题?我尝试遍历partsToChange集合并构建where子句,但它们被AND在一起而不是OR。我也不想在partsToChange列表中显式地执行每个项的等式操作。
var partsToChange = new Dictionary<string, string> {
{"0039", "Vendor A"},
{"0051", "Vendor B"},
{"0061", "Vendor C"},
{"0080", "Vendor D"},
{"0081", "Vendor D"},
{"0086", "Vendor D"},
{"0089", "Vendor E"},
{"0091", "Vendor F"},
{"0163", "Vendor E"},
{"0426", "Vendor B"},
{"1197", "Vendor B"}
};
var items = new List<MaterialVendor>();
foreach (var x in partsToChange)
{
var newItems = (
from m in MaterialVendor
where
m.Material.PartNumber == x.Key
&& m.Manufacturer.Name.Contains(x.Value)
select m
).ToList();
items.AddRange(newItems);
}
额外信息:我正在LINQPad中工作,这是一个LinqToSql查询。在这里,MaterialVendor既是一个类,也是一个DataContext表。
编辑:LinqToSql细节。
这似乎是我找到的最好的方法,既易读又能减少复杂性。它还带有一种匿名类型的附加好处,不需要显式定义集合类型。这意味着我可以用匿名类型来变化返回的内容。
var predicate = PredicateBuilder.False<MaterialVendor>();
foreach (var x in partsToChange)
{
var item = x;
predicate = predicate.Or (m =>
m.Material.PartNumber == item.Key
&& m.Manufacturer.Name.Contains(item.Value));
}
var items = from m in MaterialVendor.Where(predicate)
select m;
MaterialVendor
同时作为IEnumerable<T>
和一个类。它到底是哪个? - BlueRaja - Danny Pflughoeft