Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1070738
  • 博文数量: 254
  • 博客积分: 10185
  • 博客等级: 上将
  • 技术积分: 2722
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-25 15:04
文章存档

2011年(8)

2009年(1)

2008年(31)

2007年(214)

分类:

2008-01-29 02:19:26

DLINQ在VS2008中,被更名为linq to sql,本文也将跟着做相应变化,我们先接着讲LINK的语法。
Select操作
最简单的:
1,            var q =
                from c in db.Customers
                select c.ContactName;
匿名类的:
1,            var q =
                from c in db.Customers
                select new {c.ContactName, c.Phone};
2,            var q =
                from e in db.Employees
                select new {Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone};
3,            var q =
                from p in db.Products
                select new {p.ProductID, HalfPrice = p.UnitPrice / 2};
条件的:
            var q =
                from p in db.Products
                select new {p.ProductName, Availability = p.UnitsInStock - p.UnitsOnOrder < 0 ? "Out Of Stock": "In Stock"};
这种条件的会被翻译成sql中{case when condition then else}的。
name type形式的:
            var q =
                from e in db.Employees               
                select new Name {FirstName = e.FirstName, LastName = e.LastName};
只所以是name type的,是因为Name类是已经定义好的,也就是说,你可以用这种方式,返回你需要类型的对象集。
shaped形式的:            
            var q =
                from c in db.Customers
                select new {
                    c.CustomerID,
                    CompanyInfo = new {c.CompanyName, c.City, c.Country},
                    ContactInfo = new {c.ContactName, c.ContactTitle}
                };
该形式,其select操作使用了匿名对象,而这个匿名对象中,其属性也是个匿名对象。
nested形式的:
            var q =
                from o in db.Orders
                select new {
                    o.OrderID,
                    DiscountedProducts =
                        from od in o.OrderDetails
                        where od.Discount > 0.0
                        select od,
                    FreeShippingDiscount = o.Freight
                };
其返回的对象集中的每个对象DiscountedProducts属性中,又包含一个小的集合。也就是每个对象也是一个集合类。
Distinct形式的:
            var q = (
                from c in db.Customers
                select c.City )
                .Distinct();该形式,筛选该字段中不相同的值。会被翻译为
select distinct city from customers
 
where操作
最简单的:
1,            var q =
                from c in db.Customers
                where c.City == "London"
                select c;
2,            var q =
                from e in db.Employees
                where e.HireDate >= new DateTime(1994, 1, 1)
                select e;或与关系的where条件 1,            var q =
                from p in db.Products
                where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued
                select p;
2,            var q =
                from p in db.Products
                where p.UnitPrice > 10m || p.Discontinued
                select p;
3,            var q =
                db.Products.Where(p=>p.UnitPrice > 10m).Where(p=>p.Discontinued);
    在上例中,1和2语句先被翻译成类似3语句的形式,再被翻译成sql语句,送回数据服务器。他们基本上一样的。
嵌套在first操作中的where条件:
first操作,其实质就是在sql语句前,加了一个top 1.
1            Customer cust = db.Customers.First(c => c.CustomerID == "BONAP");
2            Order ord = db.Orders.First(o => o.Freight > 10.00M);
第一个例子,是筛选customerid为"BONAP"的客户,第二个筛选订单运费大于10的订单。First操作必须用这种级连的形式。比如 Shipper shipper = db.Shippers.First();也可以把linq的expression和级连的形式混合使用,比如第一个例子,加入first操作,            
                var q =
                (from c in db.Customers
                where c.City == "London"
                select c).First();
如果加入first操作,其返回是一个具体的对象,而不是一个集合。如果first操作没有条件,它只是简单的在sql语句中添加top 1,如果有条件,它在翻译时,就会加入条件语句。
阅读(1560) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~