DbContext с сущностями IQueryable пишет пользовательские запросы

Я застрял с этим требованием за последние пару дней без особого прогресса.

Наш уровень базы данных обрабатывается через DbContext с репозиторием, единицей работы. Он работает с классами poko для генерации запросов.

public virtual IQueryable<ENT> All(params Expression<Func<ENT, object>>[] includes)
    {
        IQueryable<ENT> query = Set;

        query = AddIncludesToQry(query, includes);

        return query;
    }

protected DbSet<ENT> Set
    {
        get { return Ctxt.Set<ENT>(); }
    }

protected virtual IQueryable<ENT> AddIncludesToQry(IQueryable<ENT> query, params Expression<Func<ENT, object>>[] includes)
    {
        Expression<Func<ENT, object>>[] includesToUse = d2l.NullOrEmpty(includes)
            ? DefaultIncludes
            : includes;

        if (d2l.NullOrEmpty(includesToUse)) return query;

        foreach (var incl in includesToUse)
        {
            query = query.Include(incl);
        }

        return query;
    }

ENT = класс модели poko

AddIncludesToQry = Добавляет условие в предложение where.

Это вернет все данные таблицы (в базе данных будет таблица с именем класса poko) путем фильтрации условий where.

Однако я хочу получить данные иногда немного по-другому. Например, я хочу ограничить список выбора, чтобы он возвращал имя отдела, количество (сотрудник). Для этого требуется всего два столбца в списке выбора и группировка по имени отдела.

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

может кто-нибудь посоветовать какие-нибудь мысли?


person mmssaann    schedule 27.06.2014    source источник


Ответы (1)


После операции группировки схема данных, над которыми вы работаете, изменяется (точно так же, как и в обычном SQL). Таким образом, вы, безусловно, можете продолжать ссылаться на свой запрос как IQueryable, НО НЕ как IQueryable<ENT> (как я подозреваю, вы хотели бы).

В случае IQueryable достаточно:

newQry = qry
    .GroupBy(x => x.deptName)
    .Select(y => new { deptName = y.Key, count = y.Count() });
person MatteoSp    schedule 27.06.2014