添加到 LINQ 包含表达式

Add to LINQ Include Expression

我正在编写一个函数,允许用户从数据库中获取可查询的设备列表(底层提供程序是 EF)。但我想让他们指定自己的包含,但如果他们总是包含 Capabilites 的默认包含,我该怎么做?

public IQueryable<Device> GetAllDevices(params Expression<Func<Device, object>>[] includes)
{
    // I really want to do something like includes.Add(d => d.Capabilities)
    // (I know the above code wouldnt work, but illustrates what I want)

    var newIncludes = includes /*(and somehow)*/ d => d.Capabilities, 
    return this.Repository.GetAll(newIncludes);
}

这是我的存储库 class 上使用的函数,它聚合了在其中发送的包含内容。我似乎无法弄清楚如何将单个默认包含添加到上述函数中

public IQueryable<T> GetAll(params Expression<Func<T, object>>[] includes)
{
    IQueryable<T> query = this.dbset;
    if (includes != null)
    {
        query = includes.Aggregate(query, (current, include) => current.Include(include));
    }

    return query;
}

您可以像这样链接 "Include().Include()...":

(IQueryable<T>).Include("Something").Include("SomethingElse");

您可以使用它并在 "includes" 数组上使用循环 inise 您的函数,例如:.

IQueryable<T> example = (some IQueryable<T>).Include(Capabilities);
foreach (include in includes)
    example.Include(include);

不使用相同的Include()两次没有具体限制。第二个被忽略了。

public IQueryable<Device> GetAllDevices(params Expression<Func<Device, object>>[] includes)
{
    return this.Repository.GetAll(includes).Include(x => x.Capabilities);
}

这将始终 Include(x => x.Capabilities)

您的问题不清楚...也许如果用户不包含任何内容(includes 为空),您不想包含 Capabilities:

public IQueryable<Device> GetAllDevices(params Expression<Func<Device, object>>[] includes)
{
    IQueryable<Device> query = this.Repository.GetAll(includes);

    if (includes != null && includes.Length != 0)
    {
        query = query.Include(x => x.Capabilities);
    }

    return query;
}

return 数据库集 .Where(你的情况) .Include(string.Join("., include)) .FirstOrDefault();