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<T>.</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;
}
我添加了以下扩展方法
/// <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<T>.</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;
}