2010-02-11 26 views
3

我在實體框架中遇到了一些問題。我從數據庫的視圖執行一個簡單的選擇。但是,當我查看EF生成的SQL時,它使用select from執行兩次查詢。這是它應該運作的方式嗎?看起來效率很低。實體框架:查詢無故執行'select from'

var reads = (from rt in ctx.C2kReadsToTransfer 
        where rt.ReadDt > fromDate 
        && rt.ReadDt < toDate 
        select rt); 

這被轉換爲以下SQL

SELECT 

[Extent1].[AMRID] AS [AMRID] 
, [Extent1].[Comments] AS [Comments] 
, [Extent1].[ExternalSystemType] AS [ExternalSystemType] 
, [Extent1].[LastReadDt] AS [LastReadDt] 
, [Extent1].[ReadDt] AS [ReadDt] 
, [Extent1].[Reading] AS [Reading] 
, [Extent1].[Units] AS [Units] 
, [Extent1].[Transferred] AS [Transferred] 



FROM 
    (SELECT 
     [ReadsToTransfer].[AMRID] AS [AMRID] 
     , [ReadsToTransfer].[Comments] AS [Comments] 
     , [ReadsToTransfer].[ExternalSystemType] AS [ExternalSystemType] 
     , [ReadsToTransfer].[LastReadDt] AS [LastReadDt] 
     , [ReadsToTransfer].[ReadDt] AS [ReadDt] 
     , [ReadsToTransfer].[Reading] AS [Reading] 
     , [ReadsToTransfer].[Transferred] AS [Transferred] 
     , [ReadsToTransfer].[Units] AS [Units] 
     FROM [dbo].[ReadsToTransfer] AS [ReadsToTransfer]) 
    AS [Extent1] 

這似乎是非常低效的,尤其是當表包含作爲我們確實接近250萬行。另外,如果我在代碼的末尾添加一個.Take(2000),它只會在第一個選擇上放置一個「選擇top 2000」。因此,使它選擇內部選擇的頂部2000年,這是整個表格。

對此有何看法?

+0

Duplicate:http://stackoverflow.com/questions/2112519/linq-generating-sql-with-duplicate-nested-selects/2117487 – 2010-02-11 14:01:49

回答

2

這似乎是非常低效的

我不這麼認爲...外SELECT只是內部SELECT的投影(實際上是一個標識投影),和一個突起的性能影響可以忽略不計...

關於TOP 2000子句,它在外部SELECT的事實並不意味着DB將從內部SELECT中讀取所有行;只要它們被外部SELECT請求,它就會讀取它們,然後停止。

只是嘗試手動運行查詢,有或沒有外部SELECT:我敢打賭,你不會發現任何顯着的性能差異。