3

型號:實體框架/ LINQ:從多個表中選擇列?

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
} 

public class Resource 
{ 
    [Key] 
    public int ResourceId { get; set; } 
    public string ResourceName { get; set; } 
    public string ResourceDescription { get; set; } 
} 

public class UserResource 
{ 
    [Key, Column(Order=0)] 
    public int UserId { get; set; } 
    [Key, Column(Order=1)] 
    public int ResourceId { get; set; } 
    public int ResourceQuantity { get; set; } 
} 

我想選擇UserResource模型給定的「用戶ID」從資源模型「資源名稱」和「ResourceQuantity」。 另外,一旦選定,我是否需要一個全新的模型來攜帶這兩個指定的列?

另請注意,UserResource模型有一個組合鍵,所以我很困惑如何進行連接......是這樣嗎?

var userResources = 
      from r in imDB.Resources 
      join ur in imDB.UserResources 
      on r.ResourceId equals ur.ResourceId 
      select new { r.ResourceName, ur.ResourceQuantity }; 
+0

你能解釋一下你的業務場景嗎?如果您需要使用組合鍵(作爲連接模型),則必須具有M:M關係。您的其他模型有多少關係? – Sampath 2013-02-09 14:12:02

+0

嗨,我的另一個模型是一個非常簡單的稱爲用戶。 UserResource模型加入用戶和資源模型。我更新了模型。 – Deniz 2013-02-09 14:22:28

+0

你有代碼第一還是什麼?你正在使用哪種EF版本? – Sampath 2013-02-09 14:31:13

回答

3

因此你使用Code first你可以創建你的模型如下利用EF conventions.

public class User { 
    public int Id { get; set; } 
    public string UserName { get; set; } 

    public virtual ICollection<Resource> Resources { get; set; } 
    } 

public class Resource { 
    public int Id { get; set; } 
    public string ResourceName { get; set; } 
    public int ResourceQuantity { get; set; } 

    public virtual ICollection<User> Users {get;set;} 
} 

然後EF會生成你的junction tableUsersResources.你並不需要創建額外模型你做了.EF會照顧那個。

當在EF中使用POCO時,如果您將導航屬性標記爲 虛擬,則可以使用其他EF支持,如「延遲加載」。所以在 一般在導航屬性中使用虛擬關鍵字 是一個很好的做法。

UPDATE

你可以嘗試類似如下:

方法1:基於方法的語法

imDB.Resources.Where(r => r.Users.Any(u => u.UserId == userId)) 

方法2:基於查詢語法

from r in imDB.Resources 
from u in r.Users 
where u.UserId == userId 
select r; 

我希望這對你有幫助。

+0

哇謝謝,這是否意味着我可以擺脫UserResources模型?儘管我注意到的一件事是您將「ResourceQuantity」放入資源模型中,但每個用戶都應擁有自己的任何資源數量副本。 – Deniz 2013-02-09 15:20:28

+3

該解決方案使ResourceQuantity成爲資源的一部分。我認爲這是錯誤的.. – 2013-02-09 15:21:00

+0

@Deniz你能解釋「用戶」和「ResourceQuantity」之間的關係嗎?是1:M還是M:M? – Sampath 2013-02-09 15:29:08