日期:2014-05-20  浏览次数:20942 次

LINQ to Entities 学习笔记(2)

实体关系:

实体类包含导航属性。通过导航属性,可以在数据模型间移动而不需要考虑外键关系。

?

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的方便的导航属性。