tux@ddictor Ответов: 2

фильтрация включенного свойства навигации EF


всем привет.

я пытаюсь включить навигационные свойства, которые удовлетворяют определенному условию, но метод include этого не поддерживает.так как же я могу решить эту проблему?

код, который я хочу, чтобы он работал, таков:

ctx.GetAll().include(o=>o.NavProp.Where(p=>p.Id==someId);


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

Мне нравится знать, могу ли я сделать первый подход с помощью метода include.

спасибо, что уделили мне время.

надеюсь, все ясно.

2 Ответов

Рейтинг:
2

Member 11326001

var result = _context.ctx.GetAll();
_context.Entry(result).Collection(o => o.NavProp).Query().Where(p=> p.NavProp.Id == someId).tolist();


Рейтинг:
0

Silvabolt

Попробуйте это:

ctx.GetAll().Include(o=>o.NavProp).Where(p=>p.NavProp.Id==someId);


tux@ddictor

спасибо за ответ, но то, что вы предлагаете использовать метод Where methode, чтобы получить фильтр родителей, и это не то, что я хочу.я хочу отфильтровать Чайлдс (навигационные свойства в терминах Entity Framework).Так что я хочу что-то вроде этого:

СТХ.Способность().Включают в себя(о=&ГТ;о'.NavProp.Где(navp=>navp.Id==someId);

:)

Silvabolt

Извини, чувак, я неправильно понял, но я думаю, что мой обновленный ответ должен сработать. Попробовать ее :)

Примечание: то, что вы пытаетесь сделать, не работает, потому что NavProp не является типом IEnumerable, а это означает, что вы не можете присоединить предложение linq Where к самому свойству NavProp. Мой текущий ответ захватит вам родительские объекты, содержащие NavProp, которые имеют свой NavProp.Id равен someId.

tux@ddictor

Привет, чувак, я действительно уважаю твою помощь, но позволь мне еще раз объяснить, что мне нужно.

допустим,у меня есть таблица родителя и другая таблица детей,каждый родитель может иметь несколько детей,но ребенок может иметь одного родителя, так что это отношение один ко многим, и это означает, что в моих обобщенных моделях у родителя есть свойство навигации Childs, которое является коллекцией детей .
когда я использую этот код:
СТХ=способность.Include(o.Childs) все родители загружены и все их childs.so далеко так не хорошо :).почему?

допустим я хочу чтобы все родители были загружены но для каждого родителя я хочу загрузить только его детей у которых например есть имя начинающееся с B так что я могу сделать что то вроде этого:

ListParents= ctx.GetAll().Включите((p=>p.Childs).Где(c=>c.Name-да.StartsWith("B"));

я читал некоторые статьи,в которых говорится,что это невозможно сделать, потому что метод include не принимает фильтрацию внутри него, он принимает только имена свойств для включения не больше и не меньше, а также потому, что Navpop не являются IEnumerables, как вы упомянули.
я рассматривал возможность использования проекции, которая позволяет это, но я всегда должен инкапсулировать возвращаемый результат в определенный тип, потому что результаты возвращаются как анонимный тип, который не может позволить мне заполнить мою ObservableCollection<t>, которому нужен IEnumerable или Список для его заполнения.

проекция работает нормально ,но она добавляет много работы ,и вы теперь, как программисты, ненавидите это, мы ленивы (ну и ленивы).

еще раз спасибо, и я надеюсь, что это хорошо объяснено :)

Silvabolt

Теперь я понимаю, что ты имеешь в виду. Я думаю, что короткий ответ заключается в том, что вы правы, вы не можете этого сделать, потому что Include() нетерпеливо загружает все указанное свойство.

Длинный ответ заключается в том, что вы можете обойти его, выполнив фильтрацию сообщений, то есть выполнив фильтрацию на "ListParents" после того, как вы захватите данные.

У этого парня была та же проблема, что и у вас, обратите внимание, что выбранный ответ даже не использует include:
http://stackoverflow.com/questions/11073727/filter-linq-entity-include-query

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

tux@ddictor

привет Silvabolt.спасибо Вам большое за ваши усилия.да включить() хочет, но infortunatelly больше, тогда как я хочу, чтобы это быть.

первое решение в ссылку, которую вы предложили, это то, что я сделал на самом деле usedbecause вот какие имена проекции.проекция использовать выбранный метод, но к сожалению, он возвращает анонимный тип, так что мы не можем использовать это, чтобы заполнить к ObservableCollection, который я хочу привязать к моей TreeView элемент,но мы должны создать strongely тип, который выглядит не так, как у моих родителей модель и внутри него мы можем использовать, где (), чтобы отфильтровать ребенок navprop(коллекция).

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

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