とにかく、SQL ServerでLinq to Entitiesのようにnot in句を作成できますか?
メモリー内コレクションをフィルターとして使用している場合、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 を参照)。
試してください:
from p in db.Products
where !theBadCategories.Contains(p.Category)
select p;
Linqクエリに変換するSQLクエリは何ですか?
次の拡張メソッドがあります。
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"));
リストを取得して使用しましたが、
!MyList.Contains(table.columb.tostring())
注:IlistではなくListを使用してください
私は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();