考虑一个正常的Linq表达式将是这样的:
(这只是让事情更容易理解的样本)
IQueryable<Person> personQuery= (from ppl in PersonContext
select ppl).ASQueryable();
List<Person>personList = personQuery.where(x => x.age==13).ToList();
因此,如果我决定将linq查询的第一部分放在存储过程中,则 事情将会发生这样的事情。
IQueryable<Person> personQuery= PersonContext.sp_RetrievePerson().ASQueryable();
List<Person> personList = personQuery.where(x => x.age==13).ToList();
所以对于这个问题,我认为第一种方法只在调用toList()时才发送sql调用 换句话说,发送到sql执行的查询将是
Select * from Person where age=13
但对于方法2,此查询将被执行多少次以执行? 如果它只发送了一次,它是否会使调用存储过程变得多余,因为已知存储过程具有更快的执行速度以及如何将查询发送到sql看起来像?
答案 0 :(得分:2)
我不确定这个,但PersonContext.sp_RetrievePerson()
返回ObjectResult
,它在内部使用DbDataReader。这意味着存储过程被调用一次,即
personQuery.where(x => x.age==13)
遍历生成的行并过滤掉不匹配的对象。
通过使用存储过程,您可以在查询数据库时获得较小的性能提升,但在从数据库中读取后,您必须评估人员表中的每个对象。因此,我认为在这种情况下,如果向存储过程提供参数age
以过滤数据库中已有的结果,则使用存储过程才有意义。