2017-07-06 77 views
1

我有以下简化的设置:包括不相关的表中的LINQ到实体查询

Public User 
{ 

    //Primary key 
    public int Id {get;set;} 

    public string Name {get; set;} 
} 

Public UserInfo 
{ 

    //Primary key 
    public int Id {get;set;} 

    //Foreign key to user table 
    public int userKey {get; set;} 
} 

表之间的关系是一个用户到许多用户信息

我试图从user表中选择和包括userInfo表。因为从用户表到UserInfo表中没有引用

var users = Context.user.Include(u => u.userInfos); 

我不能做到这一点。

我可以这样做:

context.userInfo.include(x => x.user) 

但如果有在用户信息表中没有相应的条目,这将不会返回任何结果,这不是我想要的。此外,这将为每个userInfo返回一行,而我想要一行用户,并将userInfo列表作为参数。

同样地,我也加入了表所示:

var users = from us in Context.user 
    join inf in Context.userInfo 
    on us.Id equals inf.userKey 
    select new //etc 

但是,这也将返回一行每用户信息录入,同样的问题上面。

总而言之,有没有一种方法可以用这张表来产生一个与include函数一样的结果。

我知道我可以调整我的设置给所有我包括这个,但这不是我在这里问的。

我怀疑这不能做,但我所有的谷歌搜索,到目前为止我还没有能够找到一个明确的答案....

+1

我想'User'有一个属性'UserInfos'或类似的东西? (顺便说一句,请自己做个大忙,并遵守命名惯例,比如以大写字母开头的类名和属性名称)。 –

+0

所以你正在寻找左加入linq?这里是一个解决方案https://stackoverflow.com/questions/3404975/left-outer-join-in-linq –

回答

1

我想为用户一行,与用户信息的列表作为参数

我假定你的意思是userInfo列表为属性。我对你的要求是什么,你只是在寻找理解:

var users = from us in Context.user 
    join inf in Context.userInfo 
     on us.Id equals inf.userKey into infg 
    select new 
    { 
     User = us, 
     UserInfos = infg 
    }; 

join ... into无异于一场GroupJoin,即用户实体加入了一组userinfos的。

更妙的是使用导航属性user.userInfos(以下勉强你的命名约定):

var users = Context.user.Include(u => u.userInfos); 
+0

我编辑了这个问题来解释为什么我不能使用你建议的include方法,但你提出的第一个解决方案是这样工作的谢谢你! – Alex