使用LINQ进行多表操作(一)

 

有时候我们需要对多张数据表进行一次性的Select操作。目前就我所知的操作方法有三种:1.直接写表达式;2.使用LoadOption选项;3.使用Join语句。那么,这三种语句用哪一种好呢?让我们来做一个小小的研究。。呱呱。。

1:1关系的多表操作

表结构如下

 

首先是测试取全记录的情况(也就是取所有字段)

直接写表达式

var user  =  context.Users.Where(p  =>  p.UserID  ==   10300 ).Select(p  =>   new   {p, p.UserData} );

SELECT   [ t0 ] . [ UserID ] [ t0 ] . [ Email ] [ t0 ] . [ NickName ] [ t2 ] . [ test ] [ t2 ] . [ UserID ]   AS   [ UserID2 ] [ t2 ] . [ MyInfo ] [ t2 ] . [ MyFriends ]   FROM   [ dbo ] . [ Users ]   AS   [ t0 ]   LEFT   OUTER   JOIN  ( SELECT   1   AS   [ test ] [ t1 ] . [ UserID ] [ t1 ] . [ MyInfo ] [ t1 ] . [ MyFriends ]   FROM   [ dbo ] . [ UserData ]   AS   [ t1 ] AS   [ t2 ]   ON   [ t2 ] . [ UserID ]   =   [ t0 ] . [ UserID ] WHERE   [ t0 ] . [ UserID ]   =   10300

使用LoadOption选项

var option  =   new  DataLoadOptions();
option.LoadWith
< User > (p  =>  p.UserData);
context.LoadOptions 
=  option;
var user 
=  context.Users.Where(p  =>  p.UserID  ==   10300 ).Single();
var userdata 
=  user.UserData;

虽然看上去取了2次数据,但是因为指定了LoadOption选项,所以也是一次性从数据库取出来的。

SELECT   [ t0 ] . [ UserID ] [ t0 ] . [ Email ] [ t0 ] . [ NickName ] [ t2 ] . [ test ] [ t2 ] . [ UserID ]   AS   [ UserID2 ] [ t2 ] . [ MyInfo ] [ t2 ] . [ MyFriends ]   FROM   [ dbo ] . [ Users ]   AS   [ t0 ]
LEFT   OUTER   JOIN  ( SELECT   1   AS   [ test ] [ t1 ] . [ UserID ] [ t1 ] . [ MyInfo ] [ t1 ] . [ MyFriends ]   FROM   [ dbo ] . [ UserData ]   AS   [ t1 ] AS   [ t2 ]   ON   [ t2 ] . [ UserID ]   =   [ t0 ] . [ UserID ]
WHERE   [ t0 ] . [ UserID ]   =   10300

 使用Join语句

var user  =  context.Users.Where(p  =>  p.UserID  ==   10300 ).Join(context.UserDatas, p  =>  p.UserID, o  =>  o.UserID, (o, p)  =>   new   { o, p } );

SELECT   [ t0 ] . [ UserID ] [ t0 ] . [ Email ] [ t0 ] . [ NickName ] [ t1 ] . [ UserID ]   AS   [ UserID2 ] [ t1 ] . [ MyInfo ] [ t1 ] . [ MyFriends ]   FROM   [ dbo ] . [ Users ]   AS   [ t0 ]   INNER   JOIN   [ dbo ] . [ UserData ]   AS   [ t1 ]   ON   [ t0 ] . [ UserID ]   =   [ t1 ] . [ UserID ]   WHERE   [ t0 ] . [ UserID ]   =   10300

但是要注意的一点是,如果用了 .Select(p => new {p, p.UserData}) 这种代码,你在使用实体的时候会稍微麻烦一点,要采用 user.p.UserID 这种形式,非常不爽。可以这样改进一下,写成 .Select(p => new {User = p, p.UserData}) 这种形式,这样的话可以使用 user.User.UserID 来访问。如果想直接用 user.UserID 来访问的话,就必须在 new 的时候为每一个属性赋名称,如果数据表字段很多的话,那我只能恭喜你中奖啦。

    如果要我评分的话,我会这样评

 

SQL代码

C# Select代码

返回实例的易用性

直接写表达式

使用LoadOption

使用Join语句

 

如果只是要取部分字段的话,我们必须在Select的时候指定要取的字段,这样的话,在返回实例的易用性上,三种方式将是一样的效果。

 

 

SQL代码

C# Select代码

返回实例的易用性

直接写表达式

使用LoadOption

使用Join语句

 

至于具体怎么用就看各位喜好了…………..当然,别忘了我们还有宇宙超级无敌的“视图”可以使用...........

To Be Continued….

转载于:https://www.cnblogs.com/yzlhccdec/archive/2008/03/10/1099327.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值