日期:2014-05-20  浏览次数:21068 次

linq 左连接 求助
现在有两个表,一个商品表,有id 和名称。一个商品标签表,有id和标签。
现在想要查商品名称和商品标签符合要求的。
自己写的linq是这样:
C# code

var products= (from p in context.Product
                           join pl in context.ProductLabel
                           on p.ProductId equals pl.ProductId into go
                           from g in go
                           where p.ProductName.Contains(data)||g.Label.Contains(data)
                           select g.Product).Distinct();


但是我用profiler查了下发现不是左连接而是inner join
那么linq的左连接应该怎么写呢?

附个创建表的sql
SQL code

create table product (product_id varchar(10),product_name varchar(20))
insert into product values('001','纯银手镯')
insert into product values('002','名族手镯')
insert into product values('003','印巴风情手镯')
insert into product values('004','泰国手镯')
insert into product values('005','波西米亚手镯')
insert into product values('006','彩绘手镯')

create table product_lable (product_id varchar(10),product_lable varchar(20))
insert into product_lable values('001','年轻')
insert into product_lable values('001','时尚')
insert into product_lable values('003','个性')
insert into product_lable values('004','时尚')
insert into product_lable values('004','年轻')
insert into product_lable values('004','活力')
go


drop table product
drop table product_lable



------解决方案--------------------
首先要说的是,你的这种提问方式我很喜欢
问题描述中有附测试数据和表结构
GOOD! 赞一个!
Try:

C# code

var products= (from p in context.Product
                   join pl in context.Product_lable.Where(l=>l.Content.Contains(data))
                   on p.Product_id equals pl.Product_id into go
                   from pl in go.DefaultIfEmpty()
                   where p.Product_name.Contains(data)
                   select new
                    {        
                        p.Product_id,
                        product_name =p.Product_name,
                        lable=pl==null?"":pl.Content
                    }).Distinct();

------解决方案--------------------
C# code
var products= (from p in context.Product
                           join pl in context.ProductLabel
                           on p.ProductId equals pl.ProductId into go
                           from g in go.DefaultIfEmpty()  
                           where p.ProductName.Contains(data)||g.Label.Contains(data)
                           select g.Product).Distinct();

------解决方案--------------------
上面的大小寫有誤,另外Content其實是product_lable這個欄位。
探讨

lambda表達式大概是這樣的。product_lable左外連接product表
C# code
context.product_lable
.GroupJoin (
context.product,
pl => pl.Product_id,
p => p.Product_id,
(pl, p) =>
new ……