LINQ to Entities学習ノート(2)

2870 ワード

エンティティ関係:
エンティティークラスにはナビゲーション属性が含まれます.プロパティをナビゲートすると、外部キー関係を考慮することなく、データモデル間を移動できます.
 
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            NorthwindEntities db = new NorthwindEntities();

            var result = from c in db.Customers
                         let o = from q in c.Orders        // let 。
                                 where (q.Employee.LastName != "King")
                                 select (q)
                         where c.City == "London" && o.Count() > 5
                         select new
                         {
                             Name = c.CompanyName,
                             Contact = c.ContactName,
                             OrderCount = o.Count()
                         };
            GridView1.DataSource = result;
            GridView1.DataBind();
        }
    }
}

   

 
このクエリは、派生ObjectContextクラスのCustomers ObjectSetを使用し、Ordersナビゲーション属性を使用してCustomerに関連付けられたすべてのOrdersをクエリします.OrderエンティティタイプのEmployeeナビゲーションプロパティを使用して、注文した従業員の姓をチェックし、Kingではない姓のデータをフィルタします.クエリーのwhere句は、CustomerとOrderエンティティタイプのフィールドを使用してフィルタされ、select句は同じタイプからフィールドを選択するための新しい匿名タイプを作成します.ナビゲーション・プロパティを使用すると、エンティティ・クラスごとに個別のクエリーを作成する必要がなく、データ・モデル間をナビゲートできます.Customers、Orders、およびEmployeesテーブルからデータを取得しましたが、それらの関連関係は必要ありません.これは、すべてのOrdersのCustomerIDが指定したCustomerインスタンスと同じ値であることを検索するためにクエリーを分割するよりもはるかに優れています.
 
 
1.一対多の関係
1対のマルチリレーションのナビゲーション属性は、強力なタイプのEntityCollectionによって処理されます.たとえば、CustomerエンティティークラスとOrderエンティティークラスは一対多の関係を持っています.指定したCustomerインスタンスからOrderインスタンスに関連付けるには、Customerを使用する必要があります.EntityCollectionのタイプのOrdersナビゲーション属性.ある関係に対して適切なレコードを選択する問題に関心を持つ必要はありません.外部キー関係で処理されているので、あるユーザーの注文を選択すると、CustomerID値とCustomerのCustomerID属性値が同じOrderインスタンスしか得られません.
SelectMany拡張メソッドを使用してLINQ to Entitiesクエリーを実行すると、EntityCollectionクラスをクエリー結果として直接使用できます.結果セットに一致するすべての結果が含まれます.例は次のとおりです.
   
NorthwindEntities db = new NorthwindEntities();

            IEnumerable<Order> orders = db.Customers
                    .Where(c => c.CustomerID == "LAZYK")
                    .SelectMany(c => c.Orders);
            GridView1.DataSource = orders;
            GridView1.DataBind();


 
    2.一対一の関係
1対1の関係には、2つのナビゲーションプロパティがあります.最初の名前はTReferenceで、その結果はEntityReferenceを返します.ここで、Tは関連関係参照のエンティティタイプです.たとえば、OrderエンティティタイプにはEmployeeReferenceのナビゲーション属性があり、EntityReferenceを返します.2番目のナビゲーション属性は、Tという名前で、Tはエンティティクラスを参照しています.たとえば、Order試験問題タイプにはEmployeeの便利なナビゲーション属性があります.