查询对象模式与LINQ
我正忙于一个新项目,正在处理我的存储库层。这将是我使用存储库模式的第二个项目。我一直在阅读Scott Millett的书Professional ASP.NET设计模式,在书中引用了案例研究,Scott在他的存储库接口中使用了查询对象模式。在我以前的项目中,我使用LINQ来实现这一目的,它工作得很好 我的问题如下:与在存储库中使用LINQ相比,使用查询对象模式实现的优缺点是什么? 以下两个场景说明了两种不同的方法: 1。查询对象模式方法查询对象模式与LINQ,linq,design-patterns,Linq,Design Patterns,我正忙于一个新项目,正在处理我的存储库层。这将是我使用存储库模式的第二个项目。我一直在阅读Scott Millett的书Professional ASP.NET设计模式,在书中引用了案例研究,Scott在他的存储库接口中使用了查询对象模式。在我以前的项目中,我使用LINQ来实现这一目的,它工作得很好 我的问题如下:与在存储库中使用LINQ相比,使用查询对象模式实现的优缺点是什么? 以下两个场景说明了两种不同的方法: 1。查询对象模式方法 public interface IReadOnlyRep
public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot
{
T FindBy(TId id);
IEnumerable<T> FindAll();
IEnumerable<T> FindBy(Query query);
}
public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot
{
T FindBy(TId id);
IQueryable<T> FindAll();
IQueryable<T> FindBy(Expression<Func<T, bool>> query);
}
公共接口IReadOnlyRepository,其中T:IAggregateRoot
{
T FindBy(TId id);
IEnumerable FindAll();
IEnumerable FindBy(查询);
}
2。LINQ方法
public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot
{
T FindBy(TId id);
IEnumerable<T> FindAll();
IEnumerable<T> FindBy(Query query);
}
public interface IReadOnlyRepository<T, TId> where T : IAggregateRoot
{
T FindBy(TId id);
IQueryable<T> FindAll();
IQueryable<T> FindBy(Expression<Func<T, bool>> query);
}
公共接口IReadOnlyRepository,其中T:IAggregateRoot
{
T FindBy(TId id);
IQueryable FindAll();
IQueryable FindBy(表达式查询);
}
任何贡献都会很有帮助。尽管我认为LINQ的表达式树只是查询对象模式的一种特殊形式,但由于其更大的灵活性,它们允许您在代码中引入只有在运行时才可见的bug。 我说的是成功转换为表达式树的C#代码,但是应该将其转换为SQL的提供者不理解它 例如:
var a = new SpecialObject();
yourRepository.FindBy(x => a.IsCorrect(x));
对于普通的查询对象,这样的错误是不可能的。尽管我认为LINQ的表达式树只是查询对象模式的一种特殊形式,但由于其更大的灵活性,它们允许您在代码中引入只有在运行时才可见的错误。 我说的是成功转换为表达式树的C#代码,但是应该将其转换为SQL的提供者不理解它 例如:
var a = new SpecialObject();
yourRepository.FindBy(x => a.IsCorrect(x));
像这样的错误对于普通查询对象是不可能的。IMHO,表达式树是查询对象模式的一种特殊形式。IMHO,表达式树是查询对象模式的一种特殊形式。Daniel,为了证实我的理解,我说得对吗?你是说LINQ的灵活性会导致代码编译的场景,但实际上它是无效的?是的,非常肯定!请参阅许多示例中的一个。或者只是在这种情况下出现的异常消息。Daniel,为了证实我的理解,我的理解正确吗?你是说LINQ的灵活特性会导致代码编译的情况,但实际上它是无效的?是的,非常肯定!请参阅,以获取许多示例中的一个。或者仅查看在这种情况下发生的异常消息。