我从之前的开发者那里继承了Generic Repository Pattern。它似乎工作正常,除了我希望FindAll()方法能够包含导航属性更多只是第一级。
签名如下:
public IEnumerable<T> FindAll(List<string> includes, Expression<Func<T, bool>> where, IEnumerable<Sorting> orderBy)
includes属性允许我传入我希望它加载的导航属性,但仅适用于顶级存储库对象。传递第一级子导航属性的导航属性名称无效。
这是完整的方法:
public IEnumerable<T> FindAll(List<string> includes, Expression<Func<T, bool>> where, IEnumerable<Sorting> orderBy)
{
IQueryable<T> query = _dbSet;
if (includes != null)
query = includes.Aggregate(query, (current, include) => current.Include(include));
if (where != null)
query = (DbQuery<T>)query.Where(where);
if (orderBy != null)
{
var first = true;
foreach (var item in orderBy)
{
var propertyName = string.IsNullOrEmpty(item.Field) ? string.Empty : item.Field.Trim();
var dir = string.IsNullOrEmpty(item.Dir) ? string.Empty : item.Dir.Trim();
if (string.IsNullOrEmpty(propertyName))
throw new ArgumentException("Invalid Property. Order By Format: Property, Property2 ASC, Property2 DESC");
var descending = false;
if (!string.IsNullOrEmpty(dir))
descending = dir.Equals("desc", StringComparison.OrdinalIgnoreCase);
if (first)
query = descending ? query.OrderByDescending(propertyName) : query.OrderBy(propertyName);
else
query = descending ? query.ThenByDescending(propertyName) : query.ThenBy(propertyName);
first = false;
}
}
return query;
}
另外,如果有更好的方法,那么请与我分享。
感谢您的帮助。
厄尔
答案 0 :(得分:0)
您仍然可以使用相同的方法。
只需在Include
字符串中包含第二级属性的名称,如下所示:
"FirstLevelProperty.SecondLevelProperty"