有没有办法拥有一个通用的 Entity Framework.Query(Expression expression) 来处理任何查询

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

也许我不在基地,如果我在,请告诉我。我试图避免在我的代码中进行复杂的查询来访问我的数据库。同时,我不希望有一个存储库 API,其中列出了所有可能的查询,供应用程序的其余部分使用。

所以...

是否可以写一个 Expression 对象的列表,一个用于每个需要的查询。这些将在其中包含 Where().Include().ThenInclude().OrderBy() 然后在需要它们的地方,在那个位置,然后有一个简单的

dbContext.Authors.Query(MyComplicatedExpressionObjectToReturnAuthorsOfRomancNovelsWrittenSince2000)

然后返回所需的列表。关键是表达式传递给数据库的地方,因此过滤发生在精心设计的 SQL 中而不是返回的数据上。

我意识到这更多的只是移动问题而不是解决问题。如果手动编写表达式很困难,那么我可能会使系统更难使用/调试。但是,如果编写 Expression 对象很简单,那么这会将所有查询放在一个位置。

这能做到吗?如果是这样,这种方法是否存在重大问题?

c# entity-framework entity-framework-core
1个回答
0
投票

你可以有一个静态类的文件,它是你的扩展方法的家。

namespace MyNamespace {
  public static class MyCustomQueries {
    public static IQueryable<T> MyComplicatedQuery<T>(this IQueryable<T> source, string genre, int since) {
        return source.Where(...).Select(...)...; // whatever implementation
    }

    // ... more extension methods
  }
}

然后,您将能够从同一命名空间中的任何地方自动使用这些扩展方法。如果你想从其他命名空间调用它们,只需导入它。

using MyNamespace;

dbContext.Authors.MyComplicatedQuery("Romance", 2000);

有关扩展方法的更多详细信息此处。您还可以查看 Linq 如何使用

Where
Select
和此类函数 here.

© www.soinside.com 2019 - 2024. All rights reserved.