我有UserClasses
,Screens
和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
我在屏幕表(Id和名称)中有以下数据:
- 1 Screen1
- 2 Screen2
- 3 Screen3
我在工作流表(UserClassificationID和ScreenID)中有以下数据:
1 1
1 2
通过查看数据Screen3
与用户分类无关。这就是我需要的,一个与给定用户分类无关的所有屏幕的列表。我该怎么做?
有关我的设置的其他信息。我为UserClasses和Screens表定义的两个类:
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 :(得分:0)
怎么样?
from s in DbContext.Screens
where s.UserClassifications.Count() == 0
select s
希望这会有所帮助
答案 1 :(得分: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不允许投影到映射类型)。