web-dev-qa-db-ja.com

LINQが存在するリスト内のオブジェクトを選択IN(A、B、C)

私は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;
140
MartinS

あなたのステータスコードもコレクションなので、 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;
235
Tim Schmelter
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;
13
user439931

Contains 関数を試してください。

シーケンスに指定の要素が含まれているかどうかを確認します。

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
11
Soner Gönül

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)が単一の値と一致するかどうかをチェックするというのは非常に論理的です。

10