2016-06-30 4 views
3

Я пытаюсь отфильтровать результаты для запроса пользователя. Например, у вас есть orders и order details и products - детская коллекция.Как фильтровать дочернюю коллекцию с помощью linq dynamic

Когда пользователь хочет фильтровать продукт я получаю сообщение об ошибке из-за No property or field 'PRODUCTS' exists in type 'ICollection 1'`

Я пишу мой запрос, как это.

var orders = _uow.Repository<ORDERS>() 
    .Query() 
    .Where("PRODUCTS.HEADING.ToLower().Contains(\"foo\")") 
    .Include("ORDER_DETAILS") 
    .Include("ORDER_DETAILS.PRODUCTS") 
    .ToList(); 

Невозможно отфильтровать дочернюю коллекцию как это? Или любой способ фильтрации?

Спасибо.

+0

Вам не нужно делать .Inculde ("ORDER_DETAILS"), это достаточно сделать. Включить ("ORDER_DETAILS.PRODUCTS"). Вы можете попробовать без строки .Include ("ORDER_DETAILS") и посмотреть, что произойдет. – meJustAndrew

+0

Заказ столов типа ЗАКАЗОВ -> ORDER_DETAILS -> ПРОДУКТЫ. Поэтому я должен включить ORDER_DETAILS, потому что содержит productID. – Kadir

+0

Я понимаю, но прошу взглянуть на примеры [msdn] (https://msdn.microsoft.com/en-us/library/bb738708 (v = vs.110) .aspx), они говорят, что в вашем случае например, ORDER_DETAILS будет включен, если вы только делаете .Include ("ORDER_DETAILS.PRODUCTS"). – meJustAndrew

ответ

1

По тому, как вы назвали свои классы/свойства, трудно догадаться, какой из них является единственным объектом и какой из них является свойством коллекции.

Если ORDERS класс свойство ORDER_DETAILS представляет собой совокупность ORDER_DETAILS класса, и ORDER_DETAILS класс свойство PRODUCTS является опаляться объектом PRODUCTS класса, имеющий строковое свойство HEADINGS, то следующий должен сделать трюк:

.Where("ORDER_DETAILS.Any(PRODUCTS.HEADING.ToLower().Contains(\"foo\"))") 

Это в основном то же, что и статический запрос с параметрами лямбда, пропущен

.Where(o => o.ORDER_DETAILS.Any(d => d.PRODUCTS.HEADING.ToLower().Contains("foo"))) 
+0

Удивительно, большое спасибо. Я не понимал, что это простое использование выражения entity framework ANY с динамической динамикой linq. – Kadir

+0

Быстрый вопрос, могу ли я использовать, когда условие с заказом также? Является ли использование таким же? – Kadir

+0

Я так думаю, но не на 100% уверен. Это пробный и ошибочный опыт, вы знаете :) –

0

Проблема в том, что ORDER_DETAILS - это список, и у каждой детали заказа есть список продуктов? Вот почему вы получаете сообщение об ошибке. Чтобы получить продукты из ORDER_DETAILS, вам нужно будет проходить через нее и получать продукты из каждого элемента.

Вы можете попробовать:

var orders = _uow.Repository<ORDERS>() 
    .Query() 
    .Where("PRODUCTS.HEADING.ToLower().Contains(\"foo\")") 
    .Include(x=>x.ORDER_DETAILS.Select(y => y.PRODUCTS)); 

Похоже, теперь у вас есть проблемы, описанной в this question. Надеюсь, что теперь это хорошо работает.

+0

Думаю, я нашел решение здесь. http://stackoverflow.com/questions/22672050/dynamic-expression-tree-to-filter-on-nested-collection-properties. Но все еще работаю над этим. – Kadir

+0

@ Kadir Я обновил свой ответ, надеюсь, что он работает – meJustAndrew

+0

Извините за поздний ответ (это был праздник в моей стране). Так что фактически мы не можем сделать ваше решение, потому что в заказе цикла foreach это фактический элемент. Мы не можем использовать метод Include или linq. Btw, что unitofwork возвращает IQuerable. – Kadir

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