LINQ解决一个两表联合统计问题LINQ的方案。

首先先把问题抽象一下:

 

单价表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)。”

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

 

 

ExpandedBlockStart.gif 代码
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
 };

 

 

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

ExpandedBlockStart.gif 代码
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的同学们一些思路,仅此而已。欢迎拍砖,指正。

 

转载于:https://www.cnblogs.com/flysnow-z/archive/2010/04/29/1723803.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值