【问题标题】:EF Linq Include multiple stringsEF Linq 包含多个字符串
【发布时间】:2019-01-17 21:03:39
【问题描述】:

所以我正在尝试使用 EF Linq 检索某些实体的(一个或多个)子级。 奇怪的是这不起作用:

public static class DbSetExtension
{
    public static IQueryable<T> Include<T>(this IDbSet<T> dbSet, params string[] paths) where T : class
    {
        foreach (var path in paths)
            dbSet.Include(path: path);

        return dbSet;
    }
}

//Usage: dbSet<Company>().Include(paths: nameof(Company.Projects))

在这种情况下,每个孩子都是空的...... 但是当我使用它时,它可以工作:

dbSet.Include("Projects");

有人知道为什么吗?我能做些什么来解决这个问题?

解决方案

public static IQueryable<T> Include<T>(this IQueryable<T> queryable, params string[] paths) where T : class
{
    foreach (var path in paths)
        queryable = queryable.Include(path: path);

    return queryable;
}

【问题讨论】:

  • 也许 dbSet = dbSet.Include("Projects");能行得通?因为你返回一个 DbSet

标签: c# entity-framework linq include


【解决方案1】:

.Include 实际上并没有改变dbSet 的任何内容。它返回一个值,而不是修改它所调用的对象。

foreach(var path in paths)
{
    dbSet = dbSet.Include(path: path);
}

应该可以。

【讨论】:

  • 请注意,要让其正常运行,dbSet 应为 IQueryable&lt;T&gt;
  • IDbSet&lt;T&gt; 扩展 IQueryable&lt;T&gt;msdn.microsoft.com/en-us/library/gg679233(v=vs.113).aspx
  • 在 IQueryable 上很好地找到并提供了解决方案。
  • IDbSet 扩展了 IQueryable。所以IDbSet&lt;T&gt;IQueryable&lt;T&gt;更具体,Include的结果是IQueryable&lt;T&gt;不能分配给它。
【解决方案2】:

好吧,这本身就是:

dbSet.Include(path: path);

不会改变 dbSet 的状态。

因此,当您返回时,包含不“包含”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多