【问题标题】:Query Object Pattern vs LINQ查询对象模式与 LINQ
【发布时间】:2011-08-16 20:00:46
【问题描述】:

我正忙于一个新项目,并且正在处理我的存储库层。这将是我使用存储库模式的第二个项目。我一直在阅读 Scott Millett 的书Professional ASP.NET Design Patterns 在参考书中的案例研究时,Scott 在他的存储库接口中使用了查询对象模式。在我之前的项目中,我为此使用了 LINQ,它运行良好。

我的问题如下:使用查询对象模式实现与在存储库中使用 LINQ 的优缺点是什么?

这里有 2 个场景来说明这 2 种不同的方法:

1.查询对象模式方法

public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot
{
    T FindBy(TId id);
    IEnumerable<T> FindAll();
    IEnumerable<T> FindBy(Query query);
}

2。 LINQ 方法

public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot
{
    T FindBy(TId id);
    IQueryable<T> FindAll();
    IQueryable<T> FindBy(Expression<Func<T, bool>> query);
}

任何贡献都会有所帮助。

【问题讨论】:

  • 恕我直言,表达式树是查询对象模式的一种特殊形式。

标签: linq design-patterns


【解决方案1】:

虽然我认为 LINQ 的表达式树只是查询对象模式的一种特殊形式,但由于它们具有更大的灵活性,它们允许您在代码中引入仅在运行时可见的错误。 我说的是成功转换为表达式树的 C# 代码,但应该将其转换为 SQL 的提供程序不理解。

例子:

var a = new SpecialObject();
yourRepository.FindBy(x => a.IsCorrect(x));

这样的错误对于普通的查询对象是不可能的。

【讨论】:

  • 所以,Daniel,为了确认我的理解,我是否正确,您是说 LINQ 的灵活性可能导致代码编译但实际上无效的情况吗?
  • 是的,绝对是!请参阅here 获取众多示例之一。
  • 或者只是google这种情况下出现的异常信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2011-10-15
相关资源
最近更新 更多