我可以将此扩展方法转换为使用IDbSet<>而不是DbContext?

时间:2016-03-31 13:07:18

标签: entity-framework linq extension-methods

目前我使用以下方法:db.GetProjectsAllowed(profileId, profOrgList, projectList)。我想将其转换为使用IDbSet<Project>,但我不确定如何获取第二个LINQ查询。

public static IQueryable<Project> GetProjectsAllowed
(
    this IMkpContext db,
    Guid profileId,
    List<Guid> profOrgIds = null,
    List<Guid> projectIds = null
)
{
    var projects = 
        (
            from p in db.Project
                .Include(p => p.Proposals)
                .Include(p => p.RoleAssignments)
                .Include("RoleAssignments.AssigneeSnapshot")
            where p.IsActive
            select p);

    if (profOrgIds != null && profOrgIds.Any())
    {
        var profileIds = db.ProfileOrganization
            .Where(po => po.IsActive && profOrgIds.Contains(po.OrganizationId))
            .Select(po => po.ProfileId);
        projects = projects.Where(p => profileIds.Contains(p.CreatedById));
    }

    if (projectIds != null && projectIds.Any())
        projects = projects.Where(proj => projectIds.Contains(proj.ProjectId));

    return projects;//.ToList();
}

我可以将其转换为使用IDbSet<Project>吗?

1 个答案:

答案 0 :(得分:1)

在这里,为什么不将它分成两个扩展方法?这会使您的GetProjectsAllowed扩展程序更加cohesivesingle responsible

<强>第一

public static IEnumerable<Guid> GetProfileIds(
    this IDbSet<ProfileOrganization> profileOrganizations,
    IEnumerable<Guid> profOrgIds = null)
{
    return profOrgIds == null ? null :
        from po in profileOrganizations
        where po.IsActive
        where profOrgIds.Contains(po.OrganizationId)
        select po.OrganizationId;
}

public static IQueryable<Project> GetProjectsAllowed(
    this IDbSet<Project> projects, 
    IEnumerable<Guid> profileIds, 
    IEnumerable<Guid> projectIds = null)
{
    var activeProjects =
        from project in projects
        //.Include(..
        where project.IsActive
        select project;

    if (profileIds != null && profileIds.Any())
    {
        activeProjects = activeProjects.Where(p => profileIds.Contains(p.CreatedById));
    }

    if (projectIds != null && projectIds.Any())
    {
        activeProjects = activeProjects.Where(proj => projectIds.Contains(proj.ProjectId));
    }

    return activeProjects;//.ToList();
}

然后消费者可以这样称呼它:

var profileIds = db.ProfileOrganization.GetProfileIds(profOrgIds);
var projectsAllowed = db.Projects.GetProjectsAllowed(profileIds, projectIds);