web-dev-qa-db-ja.com

LINQ to Entitiesの「NOT IN」句

とにかく、SQL ServerでLinq to Entitiesのようにnot in句を作成できますか?

46
dagda1

メモリー内コレクションをフィルターとして使用している場合、Contains()の否定を使用するのがおそらく最善です。リストが長すぎる場合、これは失敗する可能性があることに注意してください。その場合、別の戦略を選択する必要があります(完全にDB指向のクエリに戦略を使用する方法については以下を参照)。

   var exceptionList = new List<string> { "exception1", "exception2" };

   var query = myEntities.MyEntity
                         .Select(e => e.Name)
                         .Where(e => !exceptionList.Contains(e.Name));

Exceptを使用して別のデータベースクエリに基づいて除外する場合は、より良い選択かもしれません。 (これは link LINQ to EntitiesでサポートされているSet拡張機能です)

   var exceptionList = myEntities.MyOtherEntity
                                 .Select(e => e.Name);

   var query = myEntities.MyEntity
                         .Select(e => e.Name)
                         .Except(exceptionList);

これは、別のテーブルのプロパティに依存する特定のエンティティを除外し、除外されないエンティティの名前が必要な複雑なエンティティを想定しています。エンティティ全体が必要な場合は、デフォルトの等値演算子を満たすように、エンティティクラスのインスタンスとして例外を作成する必要があります( docs を参照)。

92
tvanfosson

試してください:

from p in db.Products
where !theBadCategories.Contains(p.Category)
select p;

Linqクエリに変換するSQLクエリは何ですか?

14
yfeldblum

次の拡張メソッドがあります。

    public static bool IsIn<T>(this T keyObject, params T[] collection)
    {
        return collection.Contains(keyObject);
    }

    public static bool IsIn<T>(this T keyObject, IEnumerable<T> collection)
    {
        return collection.Contains(keyObject);
    }

    public static bool IsNotIn<T>(this T keyObject, params T[] collection)
    {
        return keyObject.IsIn(collection) == false;
    }

    public static bool IsNotIn<T>(this T keyObject, IEnumerable<T> collection)
    {
        return keyObject.IsIn(collection) == false;
    }

使用法:

var inclusionList = new List<string> { "inclusion1", "inclusion2" };
var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsIn(inclusionList));

var exceptionList = new List<string> { "exception1", "exception2" };
var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsNotIn(exceptionList));

値を直接渡すときにも非常に便利です。

var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsIn("inclusion1", "inclusion2"));

var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsNotIn("exception1", "exception2"));
7
JoanComasFdz

リストを取得して使用しましたが、

!MyList.Contains(table.columb.tostring())

注:IlistではなくListを使用してください

4
Mayank

私はSQLにもっと似た方法でそれを作成しました、私はそれが理解しやすいと思います

var list = (from a in listA.AsEnumerable()
            join b in listB.AsEnumerable() on a.id equals b.id into ab
            from c in ab.DefaultIfEmpty()
            where c != null
            select new { id = c.id, name = c.nome }).ToList();
0
Rodolfo Gaspar