【问题标题】:LINQ-to-SQL - when does it access the database?LINQ-to-SQL - 它何时访问数据库?
【发布时间】:2011-02-09 02:50:39
【问题描述】:

在我的 asp.net mvc 2 应用程序中,我有一个相当大量数据的操作。我使用 linq-to-sql 进行查询,同时使用存储库模式。 当我在 SQL Server 分析器中检查操作的执行时,我发现正在执行大约 60 个查询。我的问题是 - 我希望问题中有足够的信息来回答它 - asp.net mvc 是否会针对每个查询对数据库进行一次完整的往返往返,或者是因为使用linq,其实只有一次往返?

【问题讨论】:

    标签: linq-to-sql asp.net-mvc-2 sql-server-profiler


    【解决方案1】:

    我相信每个查询都是一次往返,无论是 LINQ 查询还是原始 SQL。我想这取决于您所说的“每个查询”是什么意思。

    回答您的上述评论:

    var 结果 = LINQ;

    foreach( YourDataType ydt in result ) {

    ...

    }

    【讨论】:

    • 如果可以的话,我会投票支持你的答案......你的答案与我所做的重新检查一致:我在我的操作中设置了一个断点,同时检查了探查器,它显示实际的选择实际上只在我使用查询结果的地方执行。但就往返而言,我想它会为每个选择进行一次完整的往返,当我在该操作中拥有尽可能多的选择时,这是不可接受的......
    • 我投了他一票。当您访问集合的结果时,您正在枚举它。
    • 哦,顺便说一句,这可能为时已晚,但我在多次往返数据库时遇到了与您类似的问题。看看这个:stackoverflow.com/questions/4822284/more-efficient-linq-query
    【解决方案2】:

    这取决于你的 Linq 是什么样子。据我了解,当您的结果集枚举时,您将访问数据库。

    【讨论】:

    • 谢谢,但请您澄清一下 - “当您的结果集枚举时”是什么意思? - 你的意思是说 - 当查询返回 IQueryable 或 IEnumerable 之类的东西时?
    • 枚举意味着访问结果,如下 Chris 所说。这类似于在将鼠标悬停在集合或 IQueryable 上时使用调试器并单击结果刷新图标。结果是延迟加载的。您可以访问计数和类似的东西,但它不会命中数据库,直到您在某处使用结果,因此枚举。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多