c# - Entity Framework 通用存储库,包括通过参数的属性

标签 c# entity-framework .net-core

我在 Entity Framework 中有一个通用存储库的实现,我正在尝试改进它以使用 EF 提供的 .Include(..) 函数,而不是通过字符串包含导航属性,以便能够安全地重命名属性。

下面是我当前的代码:

public IQueryable<T> GetAll(
        Expression<Func<T, bool>> filter = null,
        Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<T> 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);
        }
        else
        {
            return query;
        }
    }

我目前通过以下方式使用它:

repository.GetAll(
    u => u.Name = "John",
    u => u.OrderBy(x => x.Name),
    "Address.State",
);

我的问题是:如何更改方法以便能够以下列方式(或类似方式)调用它:

repository.GetAll(
    u => u.Name = "John",
    u => u.OrderBy(x => x.Name),
    u => u.Include(x => x.Address).ThenInclude(x => x.State),
);

最佳答案

我建议您保留两种方法,一种接受字符串参数,一种接受表达式参数。您的存储库的一些客户端可以更好地使用字符串签名,其中一些可以更好地使用表达式签名,这为它们带来了 IntelliSense。

public IQueryable<T> GetAll(params string[] including)
{
    var query = dbSet.AsQueryable();
    if (including != null)
        including.ToList().ForEach(include =>
        {
            if (!string.IsNullOrEmpty(include))
                query = query.Include(include);
        });
    return query;
}

public IQueryable<T> GetAll(params Expression<Func<T, object>>[] including)
{
    var query = dbSet.AsQueryable();
    if (including != null)
        including.ToList().ForEach(include =>
        {
            if (include != null)
                query = query.Include(include);
        });
    return query;
}

确保您已添加 using System.Data.Entity;

您可以用相同的方式实现过滤和排序的逻辑。对于过滤和排序的字符串参数签名,您可以使用 System.Linq.Dynamic 包。

示例:

var result1 = schoolRepository.GetAll("Students", "Teachers");
var result2 = schoolRepository.GetAll(x=>x.Students, x=>x.Teachers);

关于c# - Entity Framework 通用存储库,包括通过参数的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53965044/

相关文章:

reactjs - 如何使用 React.js 在 Botframework v4 聊天应用程序中执行发送“键入指示器”?

c# - 在具有.Net Core的内存数据库中不向实体集合添加数据

c# - Linq 到 SQL : Exception "String must be exactly one character long"

.net - 如何在 CLR 存储过程中使用 Entity Framework?

entity-framework - ASP .Net MVC 与 Java 的 [Transient] 属性有什么相似之处吗?

c# - 转换 List<T> 中的 IEnumerable

c# - 在 C# 中可视化数据结构,例如树和图

c# - 在 C# 中使用 RSACryptoServiceProvider 加密/解密 excel 文件?

c# - Azure 存储 REST 组事务 - 请求输入之一超出范围

.net-core - Azure Devops + Coverlet + SonarQube 显示 0%