2010-10-21 69 views
4

我一直在使用Linq-to-SQL一段時間,它工作的很好。但是,最近我一直在嘗試使用它來獲取大量的數據,並且遇到了一些問題。 (當然,我明白,L2S可能不是這種特殊處理的合適的工具,但是這就是爲什麼我在嘗試 - 找到它的極限。)您是否可以使用Linq-to-SQL獲得類似DataReader的流式傳輸?

下面是一個代碼示例:

var buf = new StringBuilder(); 
var dc = new DataContext(AppSettings.ConnectionString); 
var records = from a in dc.GetTable<MyReallyBigTable>() where a.State == "OH" select a; 
var i = 0; 
foreach (var record in records) { 
    buf.AppendLine(record.ID.ToString()); 
    i += 1; 
    if (i > 3) { 
     break; // Takes forever... 
    } 
} 

一旦我開始迭代數據,查詢就會按預期執行。在單步執行代碼時,我立即進入了這個循環,這正是我所希望的 - 這意味着L2S似乎在後臺使用DataReader,而不是首先提取所有數據。但是,一旦我到達break,查詢將繼續運行並將所有其餘記錄拉出。以下是我對SO社區的問題:

1.)有沒有辦法阻止Linq-to-SQL在DataReader的中途停止執行真正的大查詢?

2.)如果你執行一個大的Linq-to-SQL查詢,是否有辦法阻止DataContext填充每個返回對象的變更跟蹤信息。基本上,我可以使用DataReader技術做一個很短的對象生命週期查詢,而不是填充內存嗎?

我很好,如果這不是DataContext本身的功能,並且需要通過一些定製擴展功能。我只是希望利用Linq的簡單性和強大功能來處理夜間處理任務的大型查詢,而不是依賴於T-SQL處理所有事情。

回答

7

1)是否有辦法從中間整理一個真正 大的查詢執行你 可以使用DataReader的方式停止LINQ到SQL?

不完全。一旦查詢被最終執行,底層SQL語句就返回匹配記錄的結果集。查詢被推遲到那一點,但不在遍歷期間。

對於您的示例,您可以簡單地使用records.Take(3),但我理解您停止此過程的實際邏輯可能在SQL外部或不易翻譯。

您可以通過構建強類型LINQ查詢然後使用舊式ADO.NET執行該查詢來使用組合方法。缺點是你失去了映射到類,不得不手動處理SqlDataReader結果。這方面的一個例子如下所示:

var query = from c in Customers 
      where c.ID < 15 
      select c; 

using (var command = dc.GetCommand(query)) 
{ 
    command.Connection.Open(); 
    using (var reader = command.ExecuteReader()) 
    { 
     int i = 0; 
     while (reader.Read()) 
     { 
      Customer c = new Customer(); 
      c.ID = reader.GetInt32(reader.GetOrdinal("ID")); 
      c.Name = reader.GetString(reader.GetOrdinal("Name")); 
      Console.WriteLine("{0}: {1}", c.ID, c.Name); 
      i++; 
      if (i > 3) 
       break; 
     } 
    } 
} 

2)如果你執行一個大型的LINQ到SQL查詢,有沒有辦法阻止 的DataContext從 變化的跟蹤信息填充每返回一個對象 。

如果您打算爲特定的查詢使用它的只讀目的,那麼你可以禁用目標跟蹤通過設置DataContext.ObjectTrackingEnabled property爲false,以提高性能:

using (var dc = new MyDataContext()) 
{ 
    dc.ObjectTrackingEnabled = false; 
    // do stuff 
} 

您還可以閱讀MSDN主題:How to: Retrieve Information As Read-Only (LINQ to SQL)

相關問題