如何避免魔术字符串表名称并在通用存储库中使用 lambda 表达式

问题描述 投票:0回答:1

我在 ASP.NET MVC 5 应用程序中使用通用存储库和实体框架(以及数据库优先方法)。

我在“创建通用存储库”(链接)中的 Microsoft 文档的帮助下创建了这个通用存储库。

在存储库中,我们有一个

Get
方法,其中有名为 include 属性的参数,该参数用于预先加载。在此参数中,我以字符串形式传递表名称。

当我需要多个表的数据时,我在表名之间使用逗号来获取它们。

  public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }.

是否有任何解决方案可以避免使用魔术字符串表名称并使用 lambda 表达式?

c# entity-framework linq asp.net-mvc-5 repository-pattern
1个回答
0
投票

如果我理解正确的话,使用这个

params Expression<Func<TEntity, object>>[] navigationProperties
就可以了。请看下面的例子:

public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>>? predicate = null,
        params Expression<Func<TEntity, object>>[] navigationProperties)
    {
        IQueryable<TEntity> dbQuery = _dbSet.AsNoTracking();

        if (predicate != null)
        {
            dbQuery = dbQuery.Where(predicate);
        }

        return navigationProperties.Aggregate(
            dbQuery,
            (current, navigationProperty) => current.Include(navigationProperty)).ToList();
    }
© www.soinside.com 2019 - 2024. All rights reserved.