LINQ to SQL文(7)のExists/In/Any/ALl/Contains


Exists/In/Any/all/containsオペレータ
適用シーン:コレクション内の要素を判断し、範囲をさらに縮小します.
Any
説明:集合に要素があるかどうかを判断するために使用されます.遅延しない.(条件が空の場合、集合は空でない限りTrueを返します.そうでない場合はFalseです).単純形式と条件付き形式の2つの形式があります.
1.簡単な形式:
注文していない顧客のみを返します.
var q =
    from c in db.Customers
    where !c.Orders.Any()
    select c;

SQL文は次のように生成されます.
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName],
[t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region],
[t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE NOT (EXISTS(
    SELECT NULL AS [EMPTY] FROM [dbo].[Orders] AS [t1]
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
   ))

2.条件付き形式:
少なくとも1つの製品が品切れになったカテゴリのみを返します.
var q =
    from c in db.Categories
    where c.Products.Any(p => p.Discontinued)
    select c;

SQL文は次のように生成されます.
SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description],
[t0].[Picture] FROM [dbo].[Categories] AS [t0]
WHERE EXISTS(
    SELECT NULL AS [EMPTY] FROM [dbo].[Products] AS [t1]
    WHERE ([t1].[Discontinued] = 1) AND 
    ([t1].[CategoryID] = [t0].[CategoryID])
    )
 
  

All

说明:用于判断集合中所有元素是否都满足某一条件;不延迟

1.带条件形式

var q =
    from c in db.Customers
    where c.Orders.All(o => o.ShipCity == c.City)
    select c;

文の説明:この例では、すべての受注がその都市に運ばれた顧客または受注されていない顧客を返します.
Contains
説明:コレクションに要素が含まれているかどうかを判断するために使用します.遅延しない.2つのシーケンスを接続します.
string[] customerID_Set =
    new string[] { "AROUT", "BOLID", "FISSA" };
var q = (
    from o in db.Orders
    where customerID_Set.Contains(o.CustomerID)
    select o).ToList();

文の説明:「AROUT」、「BOLID」、「FISSA」の3つの顧客の注文を検索します.まず、LINQ to SQLでContainsを使用する配列を定義します.配列にはすべてのCustomerIDが含まれています.つまり、結果を返すと、すべてのCustomerIDがこの集合内に含まれます.つまりinです.配列の定義をLINQ to SQL文に入れることもできます.例:
var q = (
    from o in db.Orders
    where (
    new string[] { "AROUT", "BOLID", "FISSA" })
    .Contains(o.CustomerID)
    select o).ToList();
 
  

Not Contains则取反:

var q = (
    from o in db.Orders
    where !(
    new string[] { "AROUT", "BOLID", "FISSA" })
    .Contains(o.CustomerID)
    select o).ToList();

1.オブジェクトを含む:
var order = (from o in db.Orders
             where o.OrderID == 10248
             select o).First();
var q = db.Customers.Where(p => p.Orders.Contains(order)).ToList();
foreach (var cust in q)
{
    foreach (var ord in cust.Orders)
    {
        //do something
    }
}

文の説明:この例では、Containを使用して、OrderID 10248の受注を含む顧客を検索します.
2.複数の値を含む:
string[] cities = 
    new string[] { "Seattle", "London", "Vancouver", "Paris" };
var q = db.Customers.Where(p=>cities.Contains(p.City)).ToList();

文の説明:この例では、Containsを使用して、シアトル、ロンドン、パリ、バンクーバーの都市の顧客を検索します.