Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Помогите составить выражение.  [new]
ughunter
Member

Откуда: Владивосток
Сообщений: 132
В библиотеке (по данным рефлектора) имеется следующее:

public IList<T> AllIncluding<T>(params Expression<Func<T, object>>[] includeProperties) where T : class
        {
            return includeProperties.Aggregate<Expression<Func<T, object>>,
                IQueryable<T>>(Context.Set<T>(), (current, includeProperty) => current.Include(includeProperty)).ToList();
        }


Нужно в контроллере дергать данные примерно так:

IList<Document> documents = Repository.Documents
                    .AllIncluding<Document>(a => a.Status, a => a.Type, a => a.Customer.Id == customerId);


но увы! так не получается. Помогите составить выражение, чтобы включались модели Status и Type и отбор велся по условию a.Customer.Id == customerId

Студия пишет следующее:
MSVS2015
Выражение пути поиска Include должно ссылаться на свойство навигации, определенное в типе. Используйте точечные пути в свойствах навигации ссылки, а также используйте оператор Select для свойств навигации коллекции.\r\nИмя параметра: path
24 фев 16, 11:23    [18856365]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выражение.  [new]
hVostt
Member

Откуда:
Сообщений: 18555
ughunter,

по условию нельзя.

используй проекции.
25 фев 16, 09:35    [18860581]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выражение.  [new]
hVostt
Member

Откуда:
Сообщений: 18555
ughunter,

точнее по условию можно, но не через инструкцию Include, а через инструкцию Load через DbContext, что заставляет вывернуть наружу кишки доступа к данным.

в целом, нормальное включение по условию выполнить нельзя адекватным способом, поэтому...

используй проекции
25 фев 16, 09:37    [18860588]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выражение.  [new]
ughunter
Member

Откуда: Владивосток
Сообщений: 132
hVostt
ughunter,

точнее по условию можно, но не через инструкцию Include, а через инструкцию Load через DbContext, что заставляет вывернуть наружу кишки доступа к данным.

в целом, нормальное включение по условию выполнить нельзя адекватным способом, поэтому...

используй проекции


буквально в 2х словах: что есть "проекции"??
5 мар 16, 23:03    [18901935]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выражение.  [new]
hVostt
Member

Откуда:
Сообщений: 18555
ughunter
буквально в 2х словах: что есть "проекции"??


Буквально на примере:

var projectionResult = dbContext.Employees.Select(p => new 
  { 
     p.Id, 
     p.Name, 
     SalaryAmount = p.Salaries
       .Where(x => x.IsPrimary && x.Expired == null)
       .Select(x => x.Amount).FirstOrDefault(),
     Bonuses = p.Bonuses
       .Where(x => x.IsActive)
       .Select(x => new { x.Id, x.Name, x.Value })
       .ToList()
  })
  .ToList();


В projectionResult у тебя резальтат проекции, выполненный одним запросом со всеми необходимыми данными внутри, которые правильно отфильтрованы.

Автоматизировать и упростить это дело можно с AutoMapper (расширение ProjectTo).
5 мар 16, 23:09    [18901948]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить выражение.  [new]
ughunter
Member

Откуда: Владивосток
Сообщений: 132
hVostt,

кажется понимание пришло.
Спасибо.
5 мар 16, 23:26    [18902040]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить