これを行うより良い方法はありますか?partsToChange コレクションをループして where 句を構築しようとしましたが、それらを OR ではなく AND で結合しています。また、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;