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.

Искам обаче да получа данните понякога малко по-различно. Например, искам да огранича списъка за избор, за да връща име на отдел, Count(employee) Това изисква само две колони в списъка за избор и група по име на отдел.

Не съм сигурен как мога да постигна това, като използвам този модел, който все още може да бъде 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