2016-11-25 111 views
0

我是一個新的實體框架(我使用6.0,但如果我需要我可以更新),我正在尋找一種方法來綁定實體linq查詢。例如,我有:實體框架映射實體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() 

的,這個最有趣的事情是要通過導航,當我得到一個用戶的公司,我不能讓一個公司,不活躍,與同爲一個COM公司 - 我不能得到任何CustomUser這是映射到不活的用戶。

非常感謝

+1

什麼問題? – Kinetic

+0

如何通過實體框架或nuget擴展來實現此邏輯(從上下文獲取我的自定義對象)。 – VVildVVolf

+1

只需使用你的普通實體加載數據並從那裏創建自定義的數據,不是嗎? – Kinetic

回答

0

你可以用適當的getter做到這一點,如:

public class User 
{ 
    public string Name {get;set;} 
    public WorkPlace Place get{ return this.WorkPlace.Where(x => x.IsActive).FirstOrDefault();} 
    public bool IsAlive{get;set;} 
} 
+0

我必須從levelUp開發人員(他們不應該知道這個字段)隱藏unusedful屬性(如IsAlive),並且FirstOrDefault方法(據我所知)將實現這個查詢,但開發人員需要像往常一樣建立一些選擇(但我不必支持插​​入和更新)。 – VVildVVolf

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

對不起,也許在我的問題中不清楚,但我需要可查詢的集合(做一些選擇),導航必須是懶惰的 – VVildVVolf