gpt4 book ai didi

c# - Linq 用表达式查询抽象,哪种方式更好?

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:50 24 4
gpt4 key购买 nike

我们一直在寻找一种很好的方法来查询我们的数据库,重点放在易于开发、可读性和业务规则合规性上。

我在 Internet 上发现了两篇有趣的文章,它们描述了类似但略有不同的方法,一篇是使用查询对象和表达式,另一篇主要是使用具有业务相关意图和最终表达式的扩展方法。

  1. Query Object approach
  2. Extension Method approach

对于这两种情况,我们都可以拥有一些示例代码(在存储库中):

public IEnumerable<ControlOverview> GetRoutineControlOverviewsForTest(string testId, DateTime dateOfInterest)
{
var controlOverviewQuery = new ControlOverviewQuery()
.ForTest(testId)
.ForLotUsage(ControlLotUsageStatus.Routine)
.ForControlStatusAt(dateOfInterest)
.ForControlConfigurationAt(dateOfInterest)
.ForControlLotConfigurableAt(dateOfInterest);

return this.Context.ControlOverviews.Where(controlOverviewQuery.AsExpression());;
}

第二种情况:

public IEnumerable<ControlOverview> GetRoutineControlOverviewsForTest(string testId, DateTime dateOfInterest)
{
return this.Context.ControlOverviews.ForTest(testId)
.ForLotUsage(ControlLotUsageStatus.Routine)
.ForControlStatusAt(dateOfInterest)
.ForControlConfigurationAt(dateOfInterest)
.ForControlLotConfigurableAt(dateOfInterest);
}

如您所见,从开发人员的角度来看,它们或多或少是相同的。可读性相同。唯一不同的是实现细节(扩展方法与查询对象)

在我的团队中,对于使用其中一种方法存在分歧,我找不到一套好的论据(正/反)来支持一种方法或另一种方法。

我个人更喜欢第一种方法(查询对象),因为我是 OOP 专家并且喜欢它使用的构建器模式,但是为了不使用扩展方法,我找不到比这更好的论据。我非常感谢这里的一些见解。也许这只是一种编码偏好,很难或根本不可能用强有力的论据说一个肯定比另一个好

最佳答案

在我看来,这些是重要的优点

查询方法

  • 由于这些方法实际上是类方法,它们可以访问内部,特别是可以限制访问。因此,您可以强制开发人员使用查询对象而不是自定义 LINQ。这确保了一致性和可维护性,但降低了灵 active
  • 您获得了使用多态性的灵 active 。在您链接的文章中,这不是特色,但一旦您开始使用不同的查询类实现,它可能会变得很重要,例如统一访问具有不同模式的不同来源的数据

扩展方法

  • 您可以将它与接口(interface)一起使用。事实上,我最常使用扩展方法来实现接口(interface)的标准成员,我认为这是它们最有用的地方。但是,这只有在您有一些预定义的接口(interface)时才有意义,例如已经在平台中可用,例如 IQueryable。如果您使用自己的类并完全控制它,这一点就很薄弱。
  • 稍微好一点的简洁性(我知道,不是那么多,但我会说这很重要)

关于c# - Linq 用表达式查询抽象,哪种方式更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30524988/

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