Linq-Exists/In/Any/All/Clontainsオペレータ

21975 ワード

適用シーン:コレクション内の要素を判断し、範囲をさらに縮小します.
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を使用してシアトル、ロンドン、パリ、バンクーバーの都市を検索します.