Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查询对象模式与LINQ_Linq_Design Patterns - Fatal编程技术网

查询对象模式与LINQ

查询对象模式与LINQ,linq,design-patterns,Linq,Design Patterns,我正忙于一个新项目,正在处理我的存储库层。这将是我使用存储库模式的第二个项目。我一直在阅读Scott Millett的书Professional ASP.NET设计模式,在书中引用了案例研究,Scott在他的存储库接口中使用了查询对象模式。在我以前的项目中,我使用LINQ来实现这一目的,它工作得很好 我的问题如下:与在存储库中使用LINQ相比,使用查询对象模式实现的优缺点是什么? 以下两个场景说明了两种不同的方法: 1。查询对象模式方法 public interface IReadOnlyRep

我正忙于一个新项目,正在处理我的存储库层。这将是我使用存储库模式的第二个项目。我一直在阅读Scott Millett的书Professional ASP.NET设计模式,在书中引用了案例研究,Scott在他的存储库接口中使用了查询对象模式。在我以前的项目中,我使用LINQ来实现这一目的,它工作得很好

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

以下两个场景说明了两种不同的方法:

1。查询对象模式方法

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的灵活特性会导致代码编译的情况,但实际上它是无效的?是的,非常肯定!请参阅,以获取许多示例中的一个。或者仅查看在这种情况下发生的异常消息。