我是Entity框架中的新手(我使用6.0,但如果我需要,我可以更新),我正在寻找一种方法将实体绑定到linq查询。例如,我有:
public class User
{
public string Name {get;set;}
public WorkPlace Place {get;set;}
public bool IsAlive{get;set;}
}
public class WorkPlace
{
public string Name {get;set;}
public bool IsActive {get;set;}
public Collection<User> Users;
}
它们都映射到数据库中的表,我有OnModelCreating
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().ToTable(tableName: "users");
modelBuilder.Entity<WorkPlace>().ToTable(tableName: "workplaces");
}
但是我需要使用另一个对象(带导航和延迟加载):
public class CustomUser
{
public string Name {get;set;}
public CustomWorkPlace Place {get;set;}
}
public class CustomWorkPlace
{
public string Name {get;set;}
public Collection<CustomUser> Users;
}
someBuilder.Entity<CustomUser>().ToLinq(cntx => cntx.Set<User>().Where(user => user.IsAlive)).MapProperties();
// the way of mapping properties is not important
someBuilder.Entity<CustomWorkPlace>().ToLinq(cntx => cntx.Set<WorkPlace>().Where(place => plase.IsActive)).MapProperties()
最有趣的是通过导航,当我得到一个用户的公司时,我不能得到一个不活跃的公司,对于一个公司也是如此 - 我不能得到任何{{1它被映射到非活动用户。
非常感谢
答案 0 :(得分:0)
您需要映射导航属性,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().ToTable(tableName: "users");
modelBuilder.Entity<WorkPlace>().ToTable(tableName: "workplaces");
modelBuilder.Entity<User>()
.HasRequired(user => user.Place)
.WithMany(place => place.Users);
}
然后,您可以使用导航属性进行查询。
public List<CustomUser> GetActiveCustomuser()
{
return context.Users
.Where(u => u.Active)
.Select(new CustomUser()
{
Name = u.Name,
Place = new CustomPlace() { Name = u.Place.Name }
})
.ToList();
}