【问题标题】:Entity Framework and Iqueryable issue实体框架和 Iqueryable 问题
【发布时间】:2013-11-15 17:25:14
【问题描述】:

给定以下基本结构

public class Project
{
    public int ProjectId {get;set;}
    ICollection<SubProject> SubProjects {get;set;}

}

public class SubProject
{
    public int SubProjectId {get;set;}
    public int SubProjectId {get;set;}
    public int PrinterId {get;set;}
    public int AgencyId {get;set;}
    public int Status
    //Oodles more  properties
}

public class ProjectSearchResult
{
   public int ProjectId {get;set;}
   public int NoOfSubProjects {get;set;}
   //Loads more properties
}

我需要获取项目列表和他们拥有多少子项目的计数,有时按代理商,有时按打印机,有时按状态,

而不是像下面那样做

public IQueryable<ProjectSearchResult> GetProjects(int? status, int? agencyId, int?     printerId)
{

    var projects = db.Projects.Include(x=>x.SubProjects);
    if(status.HasValue)
         return projects.Select(proj=> new ProjectSearchResult
                               {
                                  ProjectId = proj.ProjectId,
                                  NoOfSubProjects = proj.SubProjects.Count(s=>s.Status = status)

};

if(agency.HasValue)
         return projects.Select(proj=> new ProjectSearchResult
                               {
                                  ProjectId = proj.ProjectId,
                                  NoOfSubProjects = proj.SubProjects.Count(s=>s.AgencyId= agency)

};
if(printer.HasValue)
         return projects.Select(proj=> new ProjectSearchResult
                               {
                                  ProjectId = proj.ProjectId,
                                  NoOfSubProjects = proj.SubProjects.Count(s=>s.PrinterId= printer)

};

有什么方法可以使它更通用并保留为IQueryable,而不返回所有子项目并在内存中进行计数?

【问题讨论】:

    标签: c# .net entity-framework iqueryable


    【解决方案1】:

    你可以这样做:

    public IQueryable<ProjectSearchResult> GetProjects(Expression<Func<SubProject, bool>> predicate)
    {
        return
            from p in db.Projects
            select new ProjectSearchResult {
                ProjectId = p.ProjectId,
                NoOfSubProjects = p.SubProjects.Count(predicate),
            };
    }
    

    如果不是很明显,你可以这样做:

    var projects = GetProjects(_ => _.Status == projectStatus);
    

    【讨论】:

    • 只是为了添加丹尼尔的答案,看看“存储库模式”,它将解决你的很多问题。创建一个IRepository&lt;T&gt;,其中T 是一个实体-然后您可以拥有一个提供count/get/update/???的通用类以可抽象的方式实现功能 - 您只需编写一次。 FWIW 我发现让所有实体继承自一个常见的 EntityBase 类(其中包含 Id 和其他常见字段)提供了一些很好的控制 - 例如,能够在上下文保存时为所有更新的记录记录表和行 ID。
    • 无论如何我们都在使用存储库模式。
    • 谢谢丹尼尔。刚开始工作,所以我会测试一下。
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多