【问题标题】:LINQ (L2E) with stored procedure and IQueryable带有存储过程和 IQueryable 的 LINQ (L2E)
【发布时间】:2011-08-01 16:29:36
【问题描述】:

考虑一个普通的 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,这个查询会被发送多少次执行呢?
如果只发送 1 次,调用存储过程是否会变得多余,因为存储过程以执行速度更快而著称,发送到 sql 的查询会是什么样子?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这也是我的猜测。当然,它比这个示例查询更复杂。当涉及到外部连接和联合以及类似的事情时,我不太擅长 SQL。但是我可以使用 LINQ 编码更好地操作它,并且更容易维护它。我使用的表至少包含 5 个联合,其中吃联合段有很多外连接。总而言之,写那个查询的人太敬虔了,但我不得不维护它。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2012-08-14
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多