DbSet 包括扩展方法循环

DbSet include extension method looping

我添加了以下扩展方法

    /// <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);
    }

城镇 class 包含县实体。

我遇到了一个无限循环,因为它调用的是扩展方法而不是基础包含方法?

知道我做错了什么吗?

这个方法有几个错误。

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

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

如您所见,它接收 IQueryable<T> 和 returns 另一个 IQueryable<T> 必须分配给一个变量并返回而不是原来的才能生效,这代码没有做。

此外,由于该方法在 DbSet<T> 类型的 set 变量上调用 Include,它比 IQueryable<T> 更具体,并且参数与自定义方法,编译器只是调用相同的方法,因此 WhosebugException.

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

public static IQueryable<T> Include<T>(this DbSet<T> set, params Expression<Func<T, object>>[] includes)
    where T : class
{
    var result = set.AsQueryable();
    if (includes != null)
    {
        foreach (var expression in includes)
        {
            result = result.Include(expression);
        }
    }
    return result;
}