C# 方法可以允许可为 null 的列表作为参数吗?

M K*_* II 4 c# linq

我正在尝试编写一种允许搜索 ID 列表的方法,但我希望允许该列表是可选的。我见过 的例子,List<string>但我遇到了麻烦List<Guid>

在 LinqPad 中尝试此方法,我收到消息:

无法创建“System.Collections.Generic.List`1[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”类型的空常量值。此上下文中仅支持实体类型、枚举类型或基本类型。

方法如下:

public static ICollection<Project> GetProjectsAllowed
(
    this IMkpContext db,
    Guid profileId,
    List<Guid> profOrgIds = null
)
{
    var projects = (from p in db.Project.Include(p => p.Proposals)
                    join po in db.ProfileOrganization on p.CreatedById equals po.ProfileId
                    where (profOrgIds == null || profOrgIds.Contains(po.OrganizationId))
                        && p.IsActive && po.IsActive
                    select p);

    return projects.ToList();
}
Run Code Online (Sandbox Code Playgroud)

更新:感谢您的评论,这就是我所做的:

public static ICollection<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)
                    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();
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ans 5

AC# 方法可以接受空列表。您遇到的问题是 LINQ 查询本身。

您无法将列表上的 NULL 检查传递profOrgIds到实体框架相关的 LINQ 查询中,因为实体框架 LINQ 提供程序(此处使用的是,当您针对 EF 数据库上下文对象执行 LINQ 查询时)无法转换查询语法转换为等效的 T-SQL。

换句话说,摆脱

profOrgIds == null

从查询中,您应该没问题,但在调用查询之前,您需要检查 profOrgIds 是否为空。