none
Многоуровневые EntityCollection RRS feed

  • Вопрос

  • Здравствуйте.

    БД содержить таблицу "Пачки" и две таблицы "Реестр1" и "Реестр2", записи которых связанны с "Пачки" по id её записей.

    Я получаю основной набор данных так:

    IQueryable<Пачки> ie = this.ObjectContext.Пачки
    .Include("Реестр1")
    .Include("Реестр2")

    Аналогично получается фильтровать:

    IQueryable<Пачки> ie = this.ObjectContext.Пачки
    .Include("Реестр1")
    .Include("Реестр2")
    .Where(i => i.Номер == value);

    При работе с данными появилась задача получения IQueryable<Пачки>, для которой фильтр применяется не к самой пачке, как это только что продемонстрировано, а к свойству элементов дочерних коллекций Реестр1 и Реестр2. Я попытался сделать только для Реестр1 так:

    ie = ie.Where(i => i.Реестр1.Where(its => its.Номер1 == value) != null);

    Но этот вариант выдаёт ошибку:

    Не удалось сравнить элементы типа "System.Collections.Generic.IEnumerable".

    Поддерживаются только типы-примитивы и типы сущностей.

    Понятно, что это ошибочный вариант установки условия. И вот тут вопрос: А как это сделать корректно в данном случае?

    Примечание: value - строковая переменная, свойство Номер1 для Реестр1 также строковое.

    Примечание 2: можно было бы сделать простой перебор в дочерней Реестр1 с последующим удалением всех родительских пачек, у которых элементы проверяемой коллекции не прошли по условию, но, имхо, "это не наш метод" (С).








Ответы

  • Вам стоит попробовать написать запрос таким образом:

    ie = ie.Where(i => i.Реестр1.Any(its => its.Номер1 == value));
    В этом случае в конечной выборке будут Пачки, в которых есть хотя бы одна запись Реестр1 с указанным value.
    • Предложено в качестве ответа Varlamov Oleg 20 мая 2013 г. 8:11
    • Помечено в качестве ответа Lost_Stranger 20 мая 2013 г. 8:57
  • Да, спасибо, это помогло...

    Как вариант, ещё сам нашёл, что можно сделать так:

    ie.Where(i1 => i1.Реестр1.Where(its => its.Номер == value).Count() > 0)

    Но Ваш вариант лучше...
    • Предложено в качестве ответа YatajgaModerator 20 мая 2013 г. 8:26
    • Помечено в качестве ответа YatajgaModerator 20 мая 2013 г. 9:01

Все ответы