实体关系:
实体类包含导航属性。通过导航属性,可以在数据模型间移动而不需要考虑外键关系。
?
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.一对多关系
一对多关系的导航属性通过强类型的EntityCollection来处理。例如,Customer实体类和Order实体类具有一对多关系。为了从指定Customer实例关联到Order实例,需要使用Customer.Orders导航属性,它的类型是EntityCollection<Order>。针对某个关系选择合适记录的问题你不需要关心,它已经由外键关系处理了,因此选择某个用户的订单时,仅仅得到了那些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.一对一关系
对于一对一关系,有两个导航属性。第一个的名称是TReference,它返回的结果是EntityReference<T>,其中T是关联关系引用的实体类型,例如,Order实体类型有一个EmployeeReference的导航属性,它返回EntityReference<Employee>。第二个导航属性更有用,它的名字是T,T是它引用的实体类,例如,Order试题类型有一个Employee的方便的导航属性。