DbSet包括扩展方法循环

时间:2016-10-11 20:10:07

标签: linq entity-framework-5 linq-to-objects c#-5.0

我添加了以下扩展方法

    /// <summary>
    /// Provides a statically typed interface for db includes
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="set">The set.</param>
    /// <param name="includes">The includes.</param>
    /// <returns>DbSet&lt;T&gt;.</returns>
    public static DbSet<T> Include<T>(this DbSet<T> set, params Expression<Func<T, object>>[] includes) where T : class
    {
        if (includes != null)
        {
            foreach (var expression in includes)
            {
                set.Include(expression);
            }
        }
        return set;
    }

这是基于我在这里找到的存储库代码

https://github.com/carbonrobot/FullStackEF/tree/master/src

但是,当我使用以下

    public ServiceResponse<Town> Get(int id)
    {
        Func<Patient> func = delegate
        {
            using (var context = _contextFactory())
            {
                return context.Get<Town>(id, x => x.County);
            }
        };
        return this.Execute(func);
    }

城镇类包含县实体。

我得到一个无限循环,因为它调用扩展方法而不是base include?

我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:1)

这种方法有几个错误。

DbExtensions.Include方法具有以下签名:

public static IQueryable<T> Include<T, TProperty>(
    this IQueryable<T> source,
    Expression<Func<T, TProperty>> path
)
where T : class

正如您所看到的,它接收IQueryable<T>并返回另一个IQueryable<T>,必须将其分配给变量并返回而不是原始的,以便生效,而代码没有这样做。

此外,由于该方法在类型Include的{​​{1}}变量上调用set,该变量比DbSet<T>更具体,并且参数与自定义的签名匹配方法,编译器只调用相同的方法,因此IQueryable<T>

话虽如此,这是正确的自定义方法签名和实现:

StackOverflowException