2013-03-26 3 views
0

При получении доступа к базе данных с помощью Entity Framework У меня есть доступные три объекта:LINQ: ребенок фильтр объектов

  • stt_dictionary
  • stt_concept
  • stt_term

Каждый из этих объектов имеет коллекцию четвертого объекта, stt_change_log.

Так, например,

stt_dictionary.stt_change_log = ICollection<stt_change_log> 

Взаимосвязь между этими 3 верхними элементами и stt_change_log является

stt_change_log.element_id = (stt_dictionary | stt_concept | stt_term).id; 

Однако, как stt_dictionary, stt_concept и stt_term все имеет INT в качестве своего типа ID , необходимо также следующее:

stt_change_log.element_type_id = (7 | 8 | 9) 

Теперь, когда я запускаю запрос, как показано ниже, он возвращает все объекты stt_change_log с указанным идентификатором, что означает, что если я хочу объекты stt_change_log при stt_dictionary.id = 1, я также получаю записи stt_change_log, относящиеся к объектам stt_concept и stt_term, ID = 1. Другими словами, коллекция stt_change_log нуждается в дополнительной фильтрации.

var daoDictionary = (from d in db.stt_dictionary 
         .Include("stt_change_log.stt_change_types") 
        where d.id == id 
        select d).FirstOrDefault(); 

Как я могу фильтровать stt_change_log объекты, указав значение для element_type_id имущества для каждого элемента в stt_change_log коллекции?

Я также добавлю, что я намерен сделать это в одном запросе.

ответ

1

К сожалению .Include не позволяет фильтровать.

Вы можете указать use a projection, чтобы выполнить фильтрацию размера сервера, или вы можете лениво загружать элементы по мере необходимости.

Вы также можете добавить в будущее vote for that feature.

+0

Спасибо за очень быструю реакцию, Эрик. Мне не нужен этот первый .Include, поскольку этот уровень детей заполняется ассоциацией. Однако, хотя существует связь между stt_change_log и stt_change_types, stt_change_log.Свойство stt_change_type не заполняется автоматически (я не знаю почему). Итак, поскольку оператор .Include доступен только для следующего уровня вниз (а не для уровня, на который я хочу включить фильтр), это работает в мою пользу? Означает ли это, что есть * что-то, что я могу сделать в коллекции stt_change_log? – awj

1

Ваш лучший вариант - использовать сопоставление наследования по иерархии (TBH) для вашего объекта журнала. Вы должны определить базовый объект stt_change_log, а затем получить класс сущности для каждого типа журнала. Тип stt_change_type будет дискриминатором.

Тогда каждый из ваших «основных» сущностей будет ссылаться на тип журнала специфичный для данного объекта и фильтрации волшебно сделано для вас;)

Прочитайте следующий учебник для начала работы:

http://msdn.microsoft.com/en-us/data/jj618292

Обратите внимание, что в вашей ситуации вам не нужны никакие дополнительные свойства в ваших производных объектах. Если вы сначала используете код, сначала найдите «таблица по иерархическому коду»; вот быстро готов: http://blogs.msdn.com/b/wriju/archive/2011/05/17/code-first-ef-4-1-table-per-hierarchy.aspx

+0

TPH Inheritance действительно выглядит как раз то, что мне нужно. Но, потратив около 3 часов на это, я просто не могу заставить его работать - слишком много ошибок сборки. Я следовал примеру в вашей первой ссылке (я не использую Code First), но разница между моделью, используемой в примере и моей моделью, заключается в том, что у меня гораздо больше ассоциаций. В частности, существуют ассоциации в сущности, которые он говорит мне отмечать как абстрактный (и наследовать), и эти ассоциации больше не действительны после того, как я унаследовал новые сущности из объекта stt_change_log. Жаль, так как TPH выглядит очень полезно. – awj

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