0

我有一個UserClasses,ScreensWorkflow表。工作流表是UserClasses和Screens表之間的關聯表。以下是它們的結構...如何使用Entity Framework代碼優先得到不在關聯表中的其他值

UserClasses 
- UserClassID (int PK) 
- UserClass (string) 

Screens 
- ScreenID (int PK) 
- ScreenName (string) 

Workflow 
- UserClassificationID 
- ScreenID 

我在UserClasses表中的以下數據(ID和名稱):

- 1 UserClassification1 
- 2 UserClassification2 
- 3 UserClassification3 
- 4 UserClassification4 
- 5 UserClassification5 

我在屏幕表中的以下數據(ID和名稱) :

- 1 Screen1 
- 2 Screen2 
- 3 Screen3 

我在工作流表中的下列數據(UserClassificationID和ScreenID):

1 1 
1 2 

通過查看數據Screen3未關聯到用戶分類。這是我需要的,與給定用戶分類無關的所有屏幕的列表。我將如何做到這一點?

有關我的設置的其他信息。我已經爲UserClasses和屏幕表中定義的2類:

public class UserClassification : IEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Screen> Screens { get; set; } 
} 

public class Screen : IEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<UserClassification> UserClassifications { get; set; } 
} 

下面是在我的數據庫上下文類使用的配置類:所以給出了上述信息,我需要

class ScreenConfiguration : EntityTypeConfiguration<Screen>] 
{ 
    internal ScreenConfiguration() 
    { 
      this.Property(x => x.Id).HasColumnName("ScreenID"); 
      this.Property(x => x.Name).HasColumnName("ScreenName"); 
    } 
} 

class UserClassificationConfiguration : EntityTypeConfiguration<UserClassification> 
{ 
    internal UserClassificationConfiguration() 
    { 
      this.ToTable("UserClasses"); 
      this.Property(x => x.Id).HasColumnName("UserClassID"); 
      this.Property(x => x.Name).HasColumnName("UserClass"); 
      this.HasMany(i => i.Screens) 
       .WithMany(c => c.UserClassifications) 
       .Map(mc => 
       { 
        mc.MapLeftKey("UserClassificationID"); 
        mc.MapRightKey("ScreenID"); 
        mc.ToTable("Workflow"); 
       }); 
    } 
} 

返回一個用戶分類對象,其中包含與該用戶分類無關的屏幕列表,在這種情況下,該列表將是1個屏幕項目的列表。我會如何做這樣的事情?

這是我返回用戶分類對象與在關聯表屏幕列表:

return DbContext.UserClasses 
    .Include("Screens") 
    .SingleOrDefault(x => x.Id == userClassificationId); 

回答

0

怎麼樣?

from s in DbContext.Screens 
where s.UserClassifications.Count() == 0 
select s 

希望這有助於

+0

我想有一個用屏幕列表返回的用戶分類對象。這可能嗎? –

+0

我認爲是:s.UserClassifications.Where(uc => uc.Id == someUserId).Count()== 0. – tschmit007

+0

謝謝你的答案看起來不錯。 –

0

這是不可能這樣。急切加載(Include)僅適用於關聯的對象。您必須使用投影:

var result = DbContext.UserClasses 
         .Where(x => x.Id == userClassificationId) 
         .Select(x => new 
          { 
           UserClassification = x, 
           Screens = DbContext.Screens 
               .Where(s => !s.UserClasses.Any(u => u.Id) 
          }) 
         .SingleOrDefault(); 

現在您擁有一個包含用戶分類和所有不相關的屏幕匿名類型(或者,如果這樣的用戶分類不存在空值)。您可以從這些信息中構建一個新的用戶分類對象(由於EF不允許投影到映射類型,所以不能直接在Linq-to-entities查詢中執行此操作)。

+0

您的代碼存在錯誤:無法將類型'int'隱式轉換爲'bool的'。這是你的地方u => u.Id –

+0

如果可能的話,你可以去看看我的類似問題嗎?http://stackoverflow.com/questions/11311272/how-to-handle-an-association-table-linking-the-same-2-tables –

相關問題