具有IQueryable实体的DbContext编写自定义查询

时间:2014-06-27 10:00:40

标签: linq asp.net-mvc-4 c#-4.0 entity-framework-5

过去几天我一直坚持这个要求而没有太大进展。

我们的数据库层通过带有存储库,工作单元模式的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子句中添加条件。

这将通过过滤where条件来返回整个表数据(数据库中将有一个包含poko类名的表)。

但是,我希望数据有时会有所不同。 对于ex,我想限制选择列表以返回deptName,Count(employee) 这只需要选择列表中的两列,并按deptName分组。

我不知道如何使用仍然可以IQueryable查询的模式来实现这一点。

有人可以提出任何想法吗?

1 个答案:

答案 0 :(得分:1)

分组操作后,您正在处理的数据模式发生了变化(与纯SQL一样)。因此,您肯定可以继续将您的查询引用为IQueryable,而不是IQueryable<ENT>(我怀疑您想要)。

在IQueryable的情况下就足够了:

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