Hello world.

首先先把问题抽象一下:

 

单价表P_price
name price
电脑
-3000
冰箱
-1000
手机
-2000
详细表P_detalis
id userid name 
count
1---1-----电脑---10
2---1-----手机---2
3---2-----手机---3

 

 

要想显示的结果是:(条件是userid为1的用户的销售情况)
userid name 
count
1----电脑------10
1----冰箱------0
1----手机------2

 


解决此问题的SQL代码---------------------

select  
  
isnull(pd.userid,1) userid
  pp.name,
  
isnull(pd.[count],0[count]
from
  #P_price pp 
left join #P_detalis pd on pp.name=pd.name and userid=1  

 


----------------------------------------

 

直下来就是转换成LINQ代码了。本题目用到了“左外部联接(Left Outer Join)。”

应用到LINQ项目就是DefaultIfEmpty()方法。 以下是简单的例子:

var q =
 from e 
in db.Employees
 join o 
in db.Orders on e equals o.Employee into ords
 from o 
in ords.DefaultIfEmpty()
 select 
new
 {
 e.FirstName,
 e.LastName,
 Order 
= o
 };

 

 

然后我们看到在给出连接条件的时候 有两个条件

 on pp.name=pd.name and userid=1 

然后这一句如果转换成LINQ TO SQL代码的话可能会难到新手,然后这就是我将要介绍的“组合键(Composite Key)。”

下面显示一个带有组合键的例子:

 

 

代码
var q =
 from o 
in db.Orders
 from p 
in db.Products
 join d 
in db.OrderDetails
 on 
new
 {
 o.OrderID,
 p.ProductID
 } equals
 
new
 {
 d.OrderID,
 d.ProductID
 }
 into details
 from d 
in details
 select 
new
 {
 o.OrderID,
 p.ProductID,
 d.UnitPrice
 };

 

 

 好了,两个重要的概念介绍完了。接下来该应用到上面提到的具体问题了。话不多说看代码:

代码
var r = from x in DataContext.P_price
        join y 
in DataContext.P_details on new { x.name, 1 } equals new { y.name, y.userid } into pp  //这里用到了组合键
        from o in pp.DefaultIfEmpty() //这一句就是应用了左外连接
         select new
        {
           userid
=((int?)o.userid) ?? 1,
           name
=x.name,
           count
=((int?)o.count) ?? 0,
        };

 

 

最后为什么"userid=((int?)o.userid) ?? 1 " 这样写.我解释一下,P_details.userid的类型是int型,如果要使用左连接的话,势必会将null赋给它。所以在这里用一个强制类型转换。

然而至于还有什么更高效的办法,我还没有答题。

 

由于本人文笔不好,又是第一次写原创文章,多多见谅。希望本文能给刚刚学习LINQ TO SQL的同学们一些思路,仅此而已。欢迎拍砖,指正。

 

posted on 2010-04-29 14:05  Ryan.zhu  阅读(1076)  评论(3编辑  收藏  举报
come soon on