实体框架将实体映射到linq查询

时间:2016-11-25 18:55:02

标签: c# entity-framework linq

我是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它被映射到非活动用户。

非常感谢

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();
}