需要一个更好的EF FindAll()存储库方法

时间:2016-08-05 22:17:39

标签: c# entity-framework

我从之前的开发者那里继承了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;
    }

另外,如果有更好的方法,那么请与我分享。

感谢您的帮助。

厄尔

1 个答案:

答案 0 :(得分:0)

您仍然可以使用相同的方法。

只需在Include字符串中包含第二级属性的名称,如下所示:

"FirstLevelProperty.SecondLevelProperty"