198

のリストがあり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;
4

5 に答える 5

343

ステータスコードもコレクションなので、次を使用します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;
于 2013-01-10T11:55:06.150 に答える
19
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;
于 2013-01-10T11:55:21.273 に答える
18

関数で試してくださいContains

指定された要素がシーケンスに含まれているかどうかを判断します。

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
于 2013-01-10T11:56:05.283 に答える
18

注意:これはオブジェクトへの LINQ です。エンティティへの LINQ で機能するかどうかは 100% 確信が持てず、今は確認する時間がありません。実際、[A, B, C] の x に変換するのはそれほど難しくありませんが、自分で確認する必要があります。

そのため、 Containsの代わりに???? の代わりに あなたのコードでは、より LINQ っぽいAnyを使用できます。

// 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 から知っていることとは逆です。これが、それほど明白ではない理由です。

もちろん、ここで流暢な構文を好む場合は、次のとおりです。

var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));

ここでも LINQ の驚きの 1 つが見られます (select を最後に置く Joda スピーチなど)。ただし、この意味では、リスト (セット、コレクション) 内の項目 (つまりany ) の少なくとも 1 つが単一の値と一致するかどうかをチェックすることは非常に論理的です。

于 2015-07-26T15:58:51.487 に答える