首先先把问题抽象一下:
单价表P_price
name price
电脑-3000
冰箱-1000
手机-2000
详细表P_detalis
id userid name count
1---1-----电脑---10
2---1-----手机---2
3---2-----手机---3
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
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
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
};
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
};
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,
};
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的同学们一些思路,仅此而已。欢迎拍砖,指正。