2017-07-06 78 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