也许我不在基地,如果我在,请告诉我。我试图避免在我的代码中进行复杂的查询来访问我的数据库。同时,我不希望有一个存储库 API,其中列出了所有可能的查询,供应用程序的其余部分使用。
所以...
是否可以写一个 Expression 对象的列表,一个用于每个需要的查询。这些将在其中包含 Where().Include().ThenInclude().OrderBy() 然后在需要它们的地方,在那个位置,然后有一个简单的
dbContext.Authors.Query(MyComplicatedExpressionObjectToReturnAuthorsOfRomancNovelsWrittenSince2000)
然后返回所需的列表。关键是表达式传递给数据库的地方,因此过滤发生在精心设计的 SQL 中而不是返回的数据上。
我意识到这更多的只是移动问题而不是解决问题。如果手动编写表达式很困难,那么我可能会使系统更难使用/调试。但是,如果编写 Expression 对象很简单,那么这会将所有查询放在一个位置。
这能做到吗?如果是这样,这种方法是否存在重大问题?
你可以有一个静态类的文件,它是你的扩展方法的家。
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.