2010-12-14 57 views
1

比方說,我有以下查詢:亞音速 - 轉換的LINQ查詢到SQL查詢/ DataReader的

int x = 5; 
var result = from p in db.products 
      where p.CategoryId == x 
      select p; 

int count = result.Count(); 
List<product> products = result.ToList(); 

這就是我現在有。但是,我需要從結果中獲得一個DataReader:

// that's what I need: 
var reader = ConvertSubSonicLinqQueryToDataReader(result); 

如何將linq語句轉換爲我可以使用的語句? 一個DataReader或一個DbCommand,甚至包含一個參數列表的純sql。

我知道SubSonic可以做到這一點(因爲它將查詢翻譯爲普通的SQL),但我還沒有發現任何公共可訪問的方法。

有什麼建議嗎?

+0

你想用DataReader做什麼?也許我們可以提出一些建議。 – 2010-12-14 13:24:36

+0

我必須將DataReader傳遞給第三方方法(將linq查詢編譯爲普通的sql語句就足夠了,因此我可以使用InlineQuery) – 2010-12-14 14:10:30

回答

1

轉換LINQ查詢是錯誤的方法。 LINQ以高於DataReader工作的抽象級別返回結果。

還存在延遲執行問題,因此您的LINQ查詢可能無法作爲單個SQL語句執行。

Rater比使用LINQ語句爲什麼不只是使用SqlQuery而不是?

var qry = new Select().From(Product.Schema).Where(Product.CategoryIdColumn).IsEqualTo(x); 

return qry.ExecuteReader(); 

編輯:
剛剛看到你使用SubSonic3(而不是2如上面的代碼將是),但LINQ的潛在濫用和重複工作仍然有效。

+0

我知道Linq Query是首先獲得的表達式如果需要的話執行(這就是爲什麼我在我的例子中包含兩個語句「Count()」和「ToList()」,這導致兩個不同的查詢)。 SubSonic必須有能力將一個特定的IQuerable 轉換爲類似於「IDataReader」或「IDbCommand」的東西,因爲在一天結束時亞音速必須針對dbms執行它。也許這種方法不在公共接口atm中,但我相信我會以某種方式解決它。順便說一句。這很難解釋,但我不能使用查詢工具,因爲我從另一個來源獲得IQuerable。 – 2010-12-14 20:51:26

+0

@SchlaWiener要將一個'IQueryable '變成'IDataReader'需要挖掘一些'SubSonic.core'的源代碼。我首先看看'SubSonic.Linq.Strucutre.QueryCompiler'和'SubSonic.SqlGenerator'。 – 2010-12-15 10:55:19

0

從DataReader創建對象的代碼可以在DbDataProvider.ToEnumerable中找到。它從DbQueryProvider的Execute方法中調用(第227行)。 「理解」LINQ魔術的最好方法是在DbQueryProvider方法上放置一些斷點。