【问题标题】:Can I convert this extension method to use IDbSet<> instead of DbContext?我可以将此扩展方法转换为使用 IDbSet<> 而不是 DbContext 吗?
【发布时间】:2016-07-19 23:10:58
【问题描述】:

目前我使用如下方法:db.GetProjectsAllowed(profileId, profOrgList, projectList)。我想将其转换为使用 IDbSet&lt;Project&gt;,但我不确定如何获取第二个 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&lt;Project&gt;

【问题讨论】:

  • 当然可以,但您必须将 ProfileOrganisation 属性作为参数传递给方法。

标签: entity-framework linq extension-methods


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2021-12-25
    • 2016-04-20
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多