1. ホーム
  2. .net

[解決済み】Linq to Entities - SQL "IN "句

2022-04-19 02:23:11

質問

T-SQLでは、次のようなクエリになります。

SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")

LINQ to Entitiesクエリでどのようにそれを再現するのでしょうか?それは可能なのでしょうか?

解決方法は?

考え方からしてひっくり返す必要があります。 適用可能なユーザー権限の定義済みセットから現在のアイテムのユーザー権限を見つけるために "in" を行うのではなく、ユーザー権限の定義済みセットが現在のアイテムの適用可能な値を含んでいるかどうかを尋ねているのです。 これは、.NETの通常のリストで項目を見つける方法と全く同じです。

LINQを使用してこれを行うには、クエリ構文を使用する方法と、メソッド構文を使用する方法の2つがあります。 基本的に、これらは同じであり、好みによって使い分けることができます。

クエリーシンタックス。

var selected = from u in users
               where new[] { "Admin", "User", "Limited" }.Contains(u.User_Rights)
               select u

foreach(user u in selected)
{
    //Do your stuff on each selected user;
}

メソッドのシンタックス。

var selected = users.Where(u => new[] { "Admin", "User", "Limited" }.Contains(u.User_Rights));

foreach(user u in selected)
{
    //Do stuff on each selected user;
}

この場合、個人的にはメソッド構文の方が好みかもしれません。なぜなら、変数を代入する代わりに、このように無名呼び出しでforeachを実行できるからです。

foreach(User u in users.Where(u => new [] { "Admin", "User", "Limited" }.Contains(u.User_Rights)))
{
    //Do stuff on each selected user;
}

構文的にはもっと複雑で、ラムダ式やデリゲートの概念を理解していないと、何が起こっているのかよくわからないかもしれませんが、見ての通り、これはかなりコードを凝縮しています。

この3つの例は、同じことをするにもかかわらず、微妙に違うのです。

別の方法では、LINQを使用せずに、同じメソッド構文で"where"を"FindAll"に置き換えて同じ結果を得ることができ、これは.NET 2.0でも機能することになります。

foreach(User u in users.FindAll(u => new [] { "Admin", "User", "Limited" }.Contains(u.User_Rights)))
{
    //Do stuff on each selected user;
}