兴国安邦

C# 3.0, Linq, Linq To Sql

博客园 首页 新随笔 联系 订阅 管理
  33 Posts :: 0 Stories :: 553 Comments :: 150 Trackbacks
从本节开始,本文正式更名为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操作
最简单的
,            var q =
                from c 
in db.Customers
                select c.ContactName;
匿名类的
,            var q =
                from c 
in db.Customers
                select 
new {c.ContactName, c.Phone};
,            var q =
                from e 
in db.Employees
                select 
new {Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone};
,            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操作:
最简单的
,            var q =
                from c 
in db.Customers
                where c.City 
== "London"
                select c;

,            var q =
                from e 
in db.Employees
                where e.HireDate 
>= new DateTime(199411)
                select e;
或与关系的where条件
,            var q =
                from p 
in db.Products
                where p.UnitsInStock 
<= p.ReorderLevel && !p.Discontinued
                select p;
,            var q =
                from p 
in db.Products
                where p.UnitPrice 
> 10m || p.Discontinued
                select p;
,            var q =
                db.Products.Where(p
=>p.UnitPrice > 10m).Where(p=>p.Discontinued);
在上例中,1和2语句先被翻译成类似3语句的形式,再被翻译成sql语句,送回数据服务器。他们基本上一样的。
欠套在first操作中的where条件:
first操作,其实质就是在sql语句前,加了一个top 1.
,            Customer cust = db.Customers.First(c => c.CustomerID == "BONAP");
            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,如果有条件,它在翻译时,就会加入条件语句。
posted on 2007-01-28 14:08 Tom Song 阅读(9014) 评论(31)  编辑 收藏 网摘 所属分类: C# 3.0

Feedback

我去看VS2007 娄,谢谢你带给我这条消息
  回复  引用    

#2楼 2007-01-28 15:29 Cat Chen      
VS2007是Jan. CTP吧,如果是Beta了就应该很快有正式版了。
  回复  引用  查看    

#3楼 2007-01-28 15:34 shewo[未注册用户]
刚用上vs2005,v2007又出来了,,

想起了joel的在行动中开火,

  回复  引用    

#4楼[楼主] 2007-01-28 15:35 宋国安      
哦,你到是提醒了我,这个是CTP版本,还不是Beta版本。不过Beta很快了,2月份的样子。
寒,版本太多了。
@Cat Chen

  回复  引用  查看    

#5楼 2007-01-28 16:46 chy710      
不知IDE最终会发展成什么样子?好怕怕噢。
  回复  引用  查看    

#6楼 2007-01-28 17:24 yanlixin
呵呵。今天我也弄了篇Orcas,不过是入门篇,没敢放到首页上.
  回复  引用    

#7楼 2007-01-28 17:26 yanlixin
to:chy710
>>不知IDE最终会发展成什么样子?好怕怕噢。
简单看了一下。IDE好像没怎么变。而且 Framework用的也是2.0的



  回复  引用    

#8楼 2007-01-28 18:12 布尔      
拥抱新生
  回复  引用  查看    

#9楼 2007-01-28 19:15 Boler Guo      
Beta1 可能要到4月份,不过Feb. CTP 快要出来了,Bug会比较多,但功能应该是全的~
  回复  引用  查看    

#10楼 2007-01-28 19:19 小新0574      
It seems very good for domain driven design, to make conceptual level real.
  回复  引用  查看    

#11楼 2007-01-28 21:19 Cat Chen      
据说设计视图与代码视图的切换会快很多,并且增加了分割视图。
  回复  引用  查看    

#12楼 2007-01-28 21:23 TSENG      
刚从VS2003转到VS2005不久,VS2007又出了,天呀..天呀....
  回复  引用  查看    

#13楼[楼主] 2007-01-29 09:15 宋国安      
linq的Framework是3.5的。
@yanlixin

  回复  引用  查看    

靠! 我vs2005还没开始用,2007就出来了~ ms真是tmd快过马去了!!
  回复  引用    

#15楼 2007-01-29 09:30 装配脑袋      
VB9预览还没有放进来。我其实一点也不想用SQL样的查询,但我无法拒绝XML彻底集成到语言的功能。我现在都快被XML弄累死了
  回复  引用  查看    

#16楼[楼主] 2007-01-29 09:38 宋国安      
vb9现在的功能暂时还不能和c#3.0比,好多东西,它暂时还不支持。比如Lambda表达式等。关于XLinq,我们先讲完dlinq再谈它吧。想什么都讲,其结果是什么也讲不好。
@装配脑袋

  回复  引用  查看    

#17楼 2007-01-29 09:54 jjx[未注册用户]
这个版本的ctp有点混乱
  回复  引用    

#18楼 2007-01-29 13:17 装配脑袋      
VB9的语言特性现在都还没实现,但是Query Expression和XML Integration已经好了。如果有个轻量级的版本,我肯定会马上使用的。呵呵
现在的CTP竟然要下载7个超大包,还有一个操作系统包,还得VPC……

  回复  引用  查看    

#19楼 2007-01-29 13:56 jjx[未注册用户]
这个版本已经提供了可安装版本了
http://www.microsoft.com/downloads/details.aspx?FamilyId=69055927-458B-4129-9047-FCC4FACAE96C&displaylang=en

不过这个ctp中,.net framework 3.0居然不是rtm版本,还有 没有wpf,wcf等的项目模板

还是等2月分的ctp吧,据说完整的linq to sql 会在那个版本中发布

  回复  引用    

#20楼 2007-01-30 17:06 zoti[未注册用户]
啟動Win2003時那個密碼好像不對哦﹐試了N久也不行﹐
microsoft公布的是﹕P2ssword
網上找了几個都是﹕P@ssw0rd
兩個都不行﹐進不了Win2003
咋辦呀?

  回复  引用    

Win2003密码是什么呀,我下载的用P2ssword也进不去呀
  回复  引用    

搞定了,密码是P2ssw0rd
是数字0不是字母o

  回复  引用    

#23楼 2007-08-09 11:27 chen[未注册用户]
请问如下sql语句用linq怎么写
select * from tableA where tableA.name like '%abc%'
and tableA.id not in
(select tableB.aid from tableB wher tableB.name like '%1234%')

  回复  引用    

#24楼[楼主] 2007-08-09 15:55 宋国安      
var q1 = (from c in db2.Customers
where SqlMethods.Like(c.CustomerID, "A%O%T")
&& !(from d in db2.Customers
where SqlMethods.Like(d.CustomerID, "BOLID")
select d.CustomerID
).Contains(c.CustomerID)
select c).ToList();

  回复  引用  查看    

#25楼[楼主] 2007-08-09 15:56 宋国安      
@chen
请参考 http://www.cnblogs.com/126/archive/2007/08/01/839448.html" target="_new">http://www.cnblogs.com/126/archive/2007/08/01/839448.html

  回复  引用  查看    

#26楼 2007-11-05 15:30 @icezs[未注册用户]
sqlmetal /server:myserver /database:northwind /namespace:nwind /code:nwind.cs
/language:csharp
这样产生的映射文件里并没有Customer和Order这两个对象啊。

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);

  回复  引用    

#27楼[楼主] 2007-11-28 20:14 Tom Song      
@@icezs
不知道,你碰到什么问题了。你的数据库有的伐?

  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 632454




相关文章:

相关链接: