查询对象模式与LINQ

时间:2011-08-16 11:47:22

标签: linq design-patterns

我正在忙于一个新项目并正在处理我的存储库层。这将是我使用Repository Pattern的第二个项目。我一直在阅读Scott Millett的书 Professional ASP.NET Design Patterns 在参考书中的案例研究时,Scott在他的存储库界面中使用了Query Object Pattern。在我之前的项目中,我为此目的使用了LINQ,它运行良好。

我的问题如下:使用查询对象模式实现与在存储库中使用LINQ相比有哪些优缺点?

以下是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);
}

任何贡献都会有所帮助。

1 个答案:

答案 0 :(得分:1)

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

示例:

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

使用普通查询对象时,这样的错误是不可能的。