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


169

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

とても早く答えてくれたすべての人に感謝します。ラムダソリューションのEsp。ラムダ式ではまだ何もしていません。私は(!0 =>(statuses.Contains(o.OrderHeaderOrderStatusCode)))私が使用して含まれていないだろうと想定
マルティンス

回答:


288

ステータスコードもコレクションなので、次を使用します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;

1
HashSetのcontainsメソッドが最も高速であり、1000を超える項目が含まれている場合は配列でパフォーマンスの問題が発生するため、allowedStatusには配列の代わりにHashSetを使用すると思います。var allowedStatus = new HashSet <string> {"A"、 "B"、 "C"};
ジェイシャー

15
var statuses = new[] { "A", "B", "C" };

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

15

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

だから、代わりに入っての代替として???? あなたのコードではAnyを使用できますでは、よりLINQっぽいを:

// 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つを確認します(最後に選択を置くJoda-speechなど)。ただし、この意味では、リスト(セット、コレクション)の少なくとも1つのアイテム(つまりany)が単一の値と一致するかどうかをチェックするのは非常に論理的です。


12

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

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

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));

-3

注意してください、.Contains()予期しない文字列を含むすべての部分文字列に一致します。たとえばnew[] { "A", "B", "AA" }.Contains("A")あなたが望まないかもしれないAとAAの両方を返します。私はそれに噛まれました。

.Any()または.Exists()より安全な選択です


new [] {"B"、 "AA"} .Contains( "A")は、trueではなくfalseを返します。
ジェイシャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.