gpt4 book ai didi

c# - 将 OData 语法与 WebAPI 和 DAL 结合使用

转载 作者:太空狗 更新时间:2023-10-30 01:03:16 25 4
gpt4 key购买 nike

我目前在与我的主项目不同的项目中有一个数据层、容纳 EF 和一个存储库模式。我正处于想要对我的查询实现分页和过滤的地步,并发现 WebAPI 具有 OData 查询支持。

这个问题可能只是因为我是新手,但如果我使用来 self 项目 Controller 的 OData 查询,它不会使我的 DAL 项目变得几乎没有必要了吗?我这么认为的原因是因为存储库的接口(interface)必须公开 IQueryable,而不是集合列表。

我有一个单独的数据层的原因是我正在尝试为我的公司创建一个 Intranet 系统,并且会有很多用户同时访问数据库。该层(我开始相信)将有助于在未来扩展系统以及数据库请求,并通过创建方法库来消除我的 Controller 中的重复请求。

在存储库中公开 IQueryables 不是很理想吗?还是我什么都不担心?

最佳答案

您应该完全从您的 DAL 中将您的实体集公开为 IQueryable

根据我的理解,您的 DAL 包装了 EF 上下文并使用存储库模式将您的实体公开为 IEnumerable/ICollection ?如果是这种情况,那么当您将实体公开为 IQueryable 时,您的查询性能将显着提高。

if I use OData queries from my project's controllers, doesn't it make my DAL project almost unnecessary?

您不应该让负责从 Controller 中的数据库接收数据/向数据库发送数据的逻辑负责,因此您的 DAL 项目中的存储库仍然有用。

解释:在性能方面,您应该记住,只要您在 IQueryable 上操作,您实际上是在对 SQL 查询进行操作,一旦您使用 ToList() 实现它,您就会对数据库执行请求并开始对数据进行操作来自系统内存。

关于从存储库公开 IQueryable:与 ICollection 相比,您不仅获得了改进的性能,而且还摆脱了许多特定的数据获取方法(如 GetAllActiveUsers、GetAllInactiveUsers 等),为存储库的使用者提供查询特定数据的可用性,这在某些情况下可能成为一个问题,因为它可能会被他们滥用。但是,我认为这不是您的问题,因为我假设您没有在大型开发人员团队中制作大型应用程序。

示例:因此,假设您有一个实体“User”和 UserRepository 类。你想接收 Email 属性中非空值的用户集合,所以你想出了以下代码:

var users = _userRepository.Users.Where(x => x.Email != null).ToList();
  1. 在将用户公开为 IEnumerable/ICollection 的情况下,您从数据库中返回所有 用户,然后在系统内存中搜索集合以查找非空值的用户电子邮件属性。在这种情况下,由 EF 生成并发送到数据库的查询类似于 SELECT * FROM [schema].[User]

  2. 在将 Users 公开为 IQueryable 的情况下,您返回所有 Email 属性中的非空值的用户已经从数据库中。在这种情况下,由 EF 生成并发送到数据库的查询看起来像 SELECT * FROM [schema].[User] WHERE [Email] IS NOT NULL

关于c# - 将 OData 语法与 WebAPI 和 DAL 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29925969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com