在方法中使用IncludeMultiple

本文关键字:IncludeMultiple 方法 | 更新日期: 2023-09-27 17:53:07

我使用Ladislav Mrnka的扩展方法:

    public static IQueryable<T> IncludeMultiple<T>(this IQueryable<T> query,
        params Expression<Func<T, object>>[] includes)
        where T : class
    {
        if (includes != null)
        {
            query = includes.Aggregate(query,
                      (current, include) => current.Include(include));
        }
        return query;
    }

我从这里采用了以下方法(经过一些更改):

public virtual IEnumerable<T> Get(
            Expression<Func<T, bool>>[] filters = null,
            Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
            string includeProperties = "")
        {
            IQueryable<T> query = GetQuery();
            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    query = query.Where(filter);
                }
            }
            foreach (var includeProperty in includeProperties.Split
                (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }
            if (orderBy != null)
            {
                query = orderBy(query);
            }
            return query;
        }

我想使用IncludeMultiple而不是includeProperties变量中的字符串。因此,我改变了函数:

public virtual IEnumerable<T> Get(
            Expression<Func<T, bool>>[] filters = null,
            Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
            params Expression<Func<T, object>>[] includes)
        {
            IQueryable<T> query = GetQuery();
            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    query = query.Where(filter);
                }
            }
            if (includes.Length > 0)
            {
                query = query.IncludeMultiple(includes);
            }
            if (orderBy != null)
            {
                query = orderBy(query);
            }
            return query;
        }

现在,我有点困惑了。此方法定义在定义了GetQuery()的类中(存储库实现)。但如果我想执行这个方法,我将首先使用GetQuery()..
我说的对吗?
它是更好地使用这作为扩展IQueryable?

在方法中使用IncludeMultiple

不,您不需要在调用GetQuery之后使用此方法,因为调用GetQuery是该方法中的第一个命令。您可以根据需要使用GetQueryGetGet方法实际上非常好,因为它隐藏了include。在单元测试和模拟的情况下,使用它作为存储库方法比使用它作为扩展方法要好得多。