c# - Entity Framework 和Iqueryable问题

标签 c# .net entity-framework iqueryable

鉴于以下基本结构

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,而不返回所有子项目并在内存中进行计数?

最佳答案

你可以这样做:

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);

关于c# - Entity Framework 和Iqueryable问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006997/

相关文章:

c# - 从 INNER JOINED 表中检索列数据?

c# - DDD 命令模式实现细节 - 持久化命令

.net - 从 DataGrid 获取特定值

.net - 在未安装 Visual Studio 的计算机上使用 FUSLOGVW.EXE

c# - 根据单元测试中传递的参数返回不同的模拟值与最小起订量

c# - EF Linq 包含多个字符串

c# - 为什么我的 edmx 文件没有更新

c# - 当直到运行时才知道列表类型时添加到列表

c# - 执行python函数返回结果给c#

c# - 如何将 asp.net Identity 连接到 SQL Azure