私はorders
のリストを持っています。
注文状況のセットに基づいてorders
を選択したいです。
だから本質的にselect orders where order.StatusCode in ("A", "B", "C")
// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
where order.StatusCode.????????("A", "B", "C")
select order;
あなたのステータスコードもコレクションなので、 Contains
を使用してください。
var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
またはクエリ構文で:
var filteredOrders = from order in orders.Order
where allowedStatus.Contains(order.StatusCode)
select order;
var statuses = new[] { "A", "B", "C" };
var filteredOrders = from order in orders.Order
where statuses.Contains(order.StatusCode)
select order;
Contains
関数を試してください。
シーケンスに指定の要素が含まれているかどうかを確認します。
var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
NB:これはオブジェクトに対するLINQであり、LINQ to entityで動作するかどうか100%確信が持てず、今すぐチェックする時間はありません。実際、それを[A、B、C]のxに変換するのはそれほど難しくありませんが、自分で確認する必要があります。
したがって、コードで????の代わりにContainsの代わりにAnyを使用できます。これはよりLINQ-uishです:
// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
where new[] { "A", "B", "C" }.Any(s => s == order.StatusCode)
select order;
SQLから知っていることの反対です。これがそれほど明白ではない理由です。
もちろん、ここで流fluentな構文を好む場合は次のとおりです。
var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));
ここでも、LINQの驚きの1つ(最後にselectを置くJoda-speechなど)を確認します。ただし、この意味では、リスト(セット、コレクション)の項目の少なくとも1つ(つまりany)が単一の値と一致するかどうかをチェックするというのは非常に論理的です。