从本节开始,本文正式更名为C#3.0 入门系列。先发布一则消息,VS2007 Beta 版本已经发布咯,下载地址:
http://www.microsoft.com/downloads/details.aspx?FamilyID=1FF0B35D-0C4A-40B4-915A-5331E11C39E6&displaylang=en
大家快去下载呀,我也好和大家一起体验该版本最新功能呀。
dlinq 也更名为linq to sql .本文也跟着做相应变化,稍候,我会去更新前面的文章。我们先接着讲linq 的语法。
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 类是已经定义好的,也就是说,你可以用这种方式,返回你需要类型的对象集(http://www.my400800.cn).
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,如果有条件,它在翻译时,就会加入条件语句。