LINQ to Entities学習ノート(2)
2870 ワード
エンティティ関係:
エンティティークラスにはナビゲーション属性が含まれます.プロパティをナビゲートすると、外部キー関係を考慮することなく、データモデル間を移動できます.
このクエリは、派生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クラスをクエリー結果として直接使用できます.結果セットに一致するすべての結果が含まれます.例は次のとおりです.
2.一対一の関係
1対1の関係には、2つのナビゲーションプロパティがあります.最初の名前はTReferenceで、その結果はEntityReferenceを返します.ここで、Tは関連関係参照のエンティティタイプです.たとえば、OrderエンティティタイプにはEmployeeReferenceのナビゲーション属性があり、EntityReferenceを返します.2番目のナビゲーション属性は、Tという名前で、Tはエンティティクラスを参照しています.たとえば、Order試験問題タイプにはEmployeeの便利なナビゲーション属性があります.
エンティティークラスにはナビゲーション属性が含まれます.プロパティをナビゲートすると、外部キー関係を考慮することなく、データモデル間を移動できます.
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
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