我正在忙于一个新项目并正在处理我的存储库层。这将是我使用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);
}
任何贡献都会有所帮助。
答案 0 :(得分:1)
虽然我认为LINQ的表达式树只是查询对象模式的一种特殊形式,但由于它们具有更大的灵活性,它们允许您在代码中引入仅在运行时可见的错误。 我说的是成功转换为表达式树的C#代码,但是应该将其转换为SQL的提供程序无法理解。
示例:
var a = new SpecialObject();
yourRepository.FindBy(x => a.IsCorrect(x));
使用普通查询对象时,这样的错误是不可能的。