我一直在设计一些通用的ORM级别的实用程序,以使调用者更轻松地使用Entity Framework以一致的方式执行操作。以下是这些方法之一:
public static IQueryable<TEntity>
QueryMany<TDbContext, TEntity, TOrder, TInclude>(TDbContext context, Expression<Func<TEntity, bool>> predicate,
Expression<Func<TEntity, TOrder>> order, bool ascending, Expression<Func<TEntity, TInclude>> include,
int skipCount, int takeMax)
where TEntity : class where TDbContext : DbContext
{
var query = context.Set<TEntity>().Where(predicate);
if (include != null)
query = query.Include(include);
if (skipCount > 0)
query = query.Skip(skipCount);
if (takeMax > 0)
query = query.Take(takeMax);
if (order != null)
query = ascending ? query.OrderBy(order) : query.OrderByDescending(order);
return query;
}
这使得可以在任何上下文中使用任何搜索谓词从任何类型的集合中查询许多项目,包括带有子级的所有子级属性集合,并采用按给定属性按升序或降序排序的功能。可以为参数提供合适的“默认”值(例如,对于“包含”和“顺序”为null,对于“跳过/获取”为零)以选择性地启用这些功能。
这很好,直到我要同时包含主要TEntity类型的子元素和TInclude类型的子元素。我已经习惯了通常的多级包含语法:
query.Include(parent => parent.Children.Select(child => child.Grandchildren)
但是,当然,在我的通用方法中,模板参数类型有效地将其固定为单一类型TInclude的单个 TEntity子属性集合。
我的问题是这样的:在我的通用方法中,有没有办法提供更通用的包含功能?最好具有任意的,多级包含功能,但是到目前为止,我还没有找到任何可行的方法。
更新:我知道一个字符串也可能包含,但是我对这种方法不感兴趣。我发现很难随着代码库的增长和发展而可靠地同步类型和字符串。请严格将答案限于LINQ语句/方法语法。