有沒有更好的方法來做到這一點?我嘗試遍歷partsToChange集合並構建where子句,但它將它們AND並在一起而不是ORing它們。我也不想明確地在partsToChange列表中的每個項目上進行平等。Linq有很長的where子句
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;
這不是你where子句的大小,它是你如何使用它的重要性。 – 2010-05-24 20:26:06
你有'MaterialVendor'作爲'IEnumerable'和這裏的一堂課。這是什麼? –
2010-05-24 21:50:56
這是一個很短的where子句。 – Randolpho 2010-05-24 21:51:01