0

我有一个UserClasses,ScreensWorkflow表。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

这是不可能的。急切加载 ( 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)。您可以根据这些信息构建新的用户分类对象(不能直接在 Linq-to-entities 查询中进行,因为 EF 不允许投影到映射类型)。

于 2012-07-04T15:10:29.150 回答