0

UserClassesScreensおよびWorkflowテーブルがあります。Workflow テーブルは、UserClasses テーブルと Screens テーブルの間の関連付けテーブルです。ここにそれらの構造があります...

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

Screens テーブルに次のデータがあります (ID と名前):

- 1 Screen1
- 2 Screen2
- 3 Screen3

Workflow テーブルに次のデータがあります (UserClassificationID と ScreenID):

1 1
1 2

データを見るとScreen3、ユーザー分類に関連付けられていません。これは私が必要としているもので、特定のユーザー分類に関連付けられていないすべての画面のリストです。どうすればいいですか?

私のセットアップに関する追加情報。UserClasses および Screens テーブル用に定義した 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);
4

2 に答える 2

0

どうですか?

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

お役に立てれば

于 2012-07-04T14:05:29.483 に答える
0

それはこの方法では不可能です。Eager ロード ( 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();

これで、ユーザー分類と関連のないすべての画面 (または、そのようなユーザー分類が存在しない場合は null) を含む匿名型ができました。これらの情報から新しいユーザー分類オブジェクトを作成できます (EF ではマップされた型への射影が許可されていないため、Linq-to-entities クエリで直接作成することはできません)。

于 2012-07-04T15:10:29.150 に答える