LINQ(L2E)具有存储过程和IQueryable

时间:2011-04-08 17:01:12

标签: c# sql-server linq-to-entities

考虑一个正常的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看起来像?

1 个答案:

答案 0 :(得分:2)

我不确定这个,但PersonContext.sp_RetrievePerson()返回ObjectResult,它在内部使用DbDataReader。这意味着存储过程被调用一次,即 personQuery.where(x => x.age==13)遍历生成的行并过滤掉不匹配的对象。

通过使用存储过程,您可以在查询数据库时获得较小的性能提升,但在从数据库中读取后,您必须评估人员表中的每个对象。因此,我认为在这种情况下,如果向存储过程提供参数age以过滤数据库中已有的结果,则使用存储过程才有意义。