1:查询语句的执行
     Linq查询语句不向命令行语句一样会被立即执行,它仅仅是一个描述性的语句,例如在下面的语句:
Linq学习笔记(2.2)——深入DLinq查询var products = db.Products.Where(p => p.UnitPrice > 50);
Linq学习笔记(2.2)——深入DLinq查询
foreach (var p in products)
Linq学习笔记(2.2)——深入DLinq查询     Response.Write(p.ProductName);
Linq学习笔记(2.2)——深入DLinq查询
foreach (var p in products)
Linq学习笔记(2.2)——深入DLinq查询     Response.Write(p.UnitPrice);

   上面代码中products的实际类型是IQueryable<Product>,一个IQueryable对象就像一个ADO.NET command 对象,它本身并不会引发一次查询的执行,而仅仅保存了一个查询的描述,同样,一个IQueryable仅仅保存了一个可编译为数据库可理解的查询表达的描述,一个command对象的ExecuteReader()的方法会引发查询的真正执行,IQueryable对象有一个GetEnumerator()方法会引发Linq查询语句的执行返回一个IEnumerator<Product>对象。向上面代码中查询会因为两次foreach而被执行两次。这种行为我们称为延迟执行。
    但是通常情况下我们希望查询语句只执行一次,结果为后面的代码重复利用,一种通用的做法是用ToArray()或ToList()将结果结果转化为数组或集合,然后使用。

Linq学习笔记(2.2)——深入DLinq查询var products = db.Products.Where(p => p.UnitPrice > 50);
Linq学习笔记(2.2)——深入DLinq查询var productlist 
= products.ToList();
Linq学习笔记(2.2)——深入DLinq查询
foreach (var p in productlist)
Linq学习笔记(2.2)——深入DLinq查询     Response.Write(p.ProductName);
Linq学习笔记(2.2)——深入DLinq查询
foreach (var p in productlist)
Linq学习笔记(2.2)——深入DLinq查询     Response.Write(p.UnitPrice);

    延迟执行的优点是可以分段构造查询语句,比如你可以先构造查询语句的一部分,在根据条件构造另外一部分,在下面的例子中,我们先查处被订购次数大于30的产品,再根据条件判断是按价格还是按id排序!

Linq学习笔记(2.2)——深入DLinq查询var products = from p in db.Products
Linq学习笔记(2.2)——深入DLinq查询               where p.OrderDetails.Count 
> 30
Linq学习笔记(2.2)——深入DLinq查询               select p;
Linq学习笔记(2.2)——深入DLinq查询var orderbystring
=Request.QueryString["orderby"];
Linq学习笔记(2.2)——深入DLinq查询
if (orderbystring == "UnitPrice")
);

2:关系查询
     在上次的练习中介绍了在实体类中通过关系特性来联系其他实体。如果实体定义了关系,则可以用以下语法来访问。
Linq学习笔记(2.2)——深入DLinq查询//查询产品ID为15的产品订单情况
Linq学习笔记(2.2)——深入DLinq查询
var Orders = db.Products.Single(p => p.ProductID == 15).OrderDetails;
    当然如果没有在实体类定义属性也可以通过下面语法来查询:
Linq学习笔记(2.2)——深入DLinq查询var Orders = from p in db.Products
Linq学习笔记(2.2)——深入DLinq查询             from o 
in db.OrderDetails
Linq学习笔记(2.2)——深入DLinq查询             where p.ProductID 
== o.ProductID && p.ProductID == 15
Linq学习笔记(2.2)——深入DLinq查询             select p.OrderDetails;
Linq学习笔记(2.2)——深入DLinq查询或者
Linq学习笔记(2.2)——深入DLinq查询var Orders 
= from p in db.Products
Linq学习笔记(2.2)——深入DLinq查询             join o 
in db.OrderDetails on p.ProductID equals o.ProductID
Linq学习笔记(2.2)——深入DLinq查询             where p.ProductID 
== 15
Linq学习笔记(2.2)——深入DLinq查询             select p.OrderDetails;

      利用关系属性来定义实体,可以使我们方便的使用"."操作符,但这样定义实体对象最主要的原因是为了在使用一个类时不需要引入其他类,避免类与类之间的耦合性,

3:延迟加载与立即加载
    当你查询一个对象时,只想查询你想得到其中的一部分,比如你列举的所有的产品,而只有当某产品的价格大于50时才准备发货即只返回价格大于50的产品订单细节,而不是返回所有产品订单细节。这时候可以用Dlinq的延迟加载技术来实现。

Linq学习笔记(2.2)——深入DLinq查询var products = from p in db.Products
Linq学习笔记(2.2)——深入DLinq查询               select p;
Linq学习笔记(2.2)——深入DLinq查询
foreach (var p in products)
}
    但有时你确实想同时得到相关的数据,比如上面的例子,在你得到产品的同时得到产品的订单情况,就只能使用下面的遍历的得出。
Linq学习笔记(2.2)——深入DLinq查询var products = from p in db.Products
Linq学习笔记(2.2)——深入DLinq查询           where p.UnitPrice
>50
Linq学习笔记(2.2)——深入DLinq查询               select p;
Linq学习笔记(2.2)——深入DLinq查询
foreach (var p in products)
}

    上面的例子的缺点时频繁的查询数据库,使数据库的负担过重,最好的做法是一次性返回产品及其订单情况,你可以用交叉或链接Dlinq查询代实现,但是这样返回的是大量数据,你可能需要定义新的匿名对象来转换这些数据,而不是原来的Product对象,而且这样可能会返回大量多余的数据,

Linq学习笔记(2.2)——深入DLinq查询DataShape ds = new DataShape();
Linq学习笔记(2.2)——深入DLinq查询ds.LoadWith
<Product>(p=>p.OrderDetails);
Linq学习笔记(2.2)——深入DLinq查询db.Shape 
= ds;        
Linq学习笔记(2.2)——深入DLinq查询var products 
= from p in db.Products
Linq学习笔记(2.2)——深入DLinq查询               where p.UnitPrice
>50
Linq学习笔记(2.2)——深入DLinq查询               select p;
}
      DataShape的LoadWith方法就是通知FrameWork在返回Product时,同时返回它的订购情况。同时我们还可以用DataShape的AssociateWith方法来实现关系的子查询。
Linq学习笔记(2.2)——深入DLinq查询Northwind db = new Northwind("data source=.\\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=Northwind;");
Linq学习笔记(2.2)——深入DLinq查询        DataShape ds 
= new DataShape();
Linq学习笔记(2.2)——深入DLinq查询        ds.AssociateWith
<Product>(p => p.OrderDetails.Where(o => o.OrderID > 10500));
Linq学习笔记(2.2)——深入DLinq查询        db.Shape 
= ds;        
Linq学习笔记(2.2)——深入DLinq查询        var products 
= from p in db.Products
Linq学习笔记(2.2)——深入DLinq查询                       where p.UnitPrice
>50
Linq学习笔记(2.2)——深入DLinq查询                       select p;
        }
Linq学习笔记(2.2)——深入DLinq查询

相关文章:

  • 2021-10-21
  • 2022-12-23
  • 2021-11-22
  • 2022-01-16
  • 2021-06-01
  • 2021-07-15
  • 2021-09-11
猜你喜欢
  • 2021-10-20
  • 2021-12-01
  • 2021-10-02
  • 2021-08-20
  • 2022-01-06
  • 2021-07-22
  • 2021-09-06
相关资源
相似解决方案