2016-11-25 4 views
0

Я новый в структуре Entity (я использую 6.0, но если мне нужно, я могу обновить), я ищу способ привязать сущность к запросу linq. Например, у меня есть:Entity Framework привязать объект к запросу 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() 

и самое интересное из этого происходит через навигацию, когда я получаю компанию из пользователей, я не должен получить компанию, которая не является активным, и то же самое для ком pany - я не должен получать CustomUser, который отображается неактивным пользователем.

Большое спасибо

+1

В чем вопрос? – Kinetic

+0

Как я могу реализовать эту логику (получение моих пользовательских объектов из контекста) с помощью фреймворка сущности или расширения расширений. – VVildVVolf

+1

Просто используйте свой обычный объект для загрузки данных и создания пользовательского оттуда, нет? – Kinetic

ответ

0

Вы могли бы сделать это с помощью надлежащего добытчика, такие как:

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

Мне нужно скрыть неиспользуемые свойства (например, IsAlive) от разработчиков levelUp (они не должны знать об этом поле), а метод 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

Смежные вопросы