2011-05-08 43 views
15

我想定義一個數據庫查詢使用LINQ和我的EntityFramework上下文,但我不希望實體返回;我想要一個datareader!如何在使用實體框架4時返回數據讀取器?

我該怎麼做?這用於將行導出爲CSV。

乾杯,伊恩。

+0

爲什麼不只是獲取對象並將它們序列化爲CSV? – R0MANARMY 2011-05-08 01:51:01

+0

我不知道會有多少對象,所以數據讀取器會阻止服務器的內存填滿。 – 2011-05-08 02:06:02

+0

從四處查看,您可能無法輕鬆找到它,有[ExecuteDbDataReader](http://msdn.microsoft.com/zh-cn/library/system.data.common.dbcommand.executedbdatareader (v = VS.90).aspx)方法,但它是受保護的,所以你可能不應該試圖獲得它。如果這不經常進行和/或如果查詢不是非常昂貴,則可以嘗試分頁查詢的結果以確保一次沒有太多內存中的對象。 – R0MANARMY 2011-05-08 02:29:56

回答

5

這個問題在EF 4左右,但對於EF 6或更高版本的其他人,您可以使用AsStreaming()擴展方法。

http://msdn.microsoft.com/en-us/library/dn237204(v=vs.113).aspx

+1

我們有一個贏家。 – 2013-11-19 21:35:37

+0

對於像我這樣的人,不知道AsStreaming()做了什麼,下面是我能找到的唯一傳遞引用:http://entityframework.codeplex.com/wikipage?title=Design%20Meeting%20Notes %20-%20December%206%2C%202012。似乎沒有其他文件在任何地方。 – Mike 2014-01-26 22:55:23

+3

此方法現在已過時,並且調用它不起作用,因爲LINQ查詢默認爲流式傳輸。不過,我猜這只是針對EF6的。您仍然應該使用拉迪斯拉夫的EF4答案。 – NightOwl888 2015-02-15 13:23:48

16

如果你需要這個,你更可能會做一些意想不到的事情。通過查詢的物化結果進行簡單迭代應該是您需要的 - 即ORM方式。如果您不喜歡,請直接使用SqlCommand

DbContext API簡化了,因此它不包含ObjectContext API中提供的許多功能。訪問數據閱讀器就是其中之一。您可以嘗試DbContext轉換爲ObjectContext和使用較爲複雜的API:

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
using (var connection = objContext.Connection as EntityConnection) 
{ 
    // Create Entity SQL command querying conceptual model hidden behind your code-first mapping 
    EntityCommand command = connection.CreateCommand(); 
    command.CommandText = "SELECT VALUE entity FROM ContextName.DbSetName AS entity"; 
    connection.Open(); 
    using (EntityDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) 
    { 
     ... 
    } 
} 

但純ADO.NET的方式更容易和更快,因爲前者的例子仍然使用查詢映射到SQL查詢:

using (var connection = new SqlConnection(Database.Connection.ConnectionString)) 
{ 
    SqlCommand command = connection.CreateCommand(); 
    command.CommandText = "SELECT * FROM DbSetName"; 
    connection.Open(); 
    using(SqlDataReader reader = command.ExecuteReader()) 
    { 

    } 
} 
+3

「如果你需要這個,你可能會做出意想不到的事情。」我不認爲請求大量的對象用於導出或生成電子郵件沒有什麼特別的奇怪之處。 ORM仍然可以物化對象,但是可以通過純數據讀取器從數據庫中流式傳輸它們。 LLBLGen允許您獲取數據讀取器。 http://www.llblgen.com/documentation/2.6/Using%20the%20generated%20code/SelfServicing/gencode_datareadersprojections.htm – 2011-05-08 17:21:37

相關問題