2012-11-06 22 views
9

我目前在爲我的項目使用LINQ to SQL時遇到了問題。這是因爲大部分冗長的SQL查詢(或,而不是)被硬編碼到C#中,而我們一直在做的事情是使用context.Database.SqlQuery<ClassName>(sql, sqlParams)對LINQ使用文本SQL

它一般非常有效,但現在我們需要更多動態的東西。我們需要插入諸如.Where(x => x.Name.Contains("Anonymous")).Take(20)之類的東西或其他東西。然而,直接插入到代碼前面提到的行會導致如下:

context.Database.SqlQuery<ClassName>(sql, sqlParams).Where(x => x.Name.Contains("Anonymous")).Take(20);

雖然它的實際工作,並拉前20條記錄,其中名稱中包含「無名氏」,表現非常糟糕。它在幕後執行的是從該表中獲取所有記錄,然後在將它們加載到內存之後進行過濾。

我想問一下,有什麼方法可以將文本SQL轉換爲LINQ,或將LINQ轉換爲SQL,這樣我就可以在一個語句中執行我的文本SQL和LINQ。如果你實際上沒有解決方案,我會很高興地感謝你的建議......!

編輯:我已經考慮過使用表達式樹,但我不知道他們如何能真正適合圖片。另外,我考慮過使用數據庫視圖。但是有太多的視圖(每個表格有很多數目),將所有內容移植到MS SQL並重寫所有查詢邏輯肯定是一件麻煩事。

+0

爲什麼在LINQ中使用'SqlQuery'而不是在DataContext中使用表? –

+5

任何SQL-to-LINQ或LINQ-to-SQL轉換都可能會由於兩者的架構差異而變得不可靠。我建議在LINQ中完全重寫查詢並避免普通的SQL。 –

+1

所以你想合併一個過時的技術與其他過時的技術。也許是時候做一些不同的事情了。 –

回答

8

由於表達式樹是從動態構建的表達式生成SQL的,所以您不能這樣做,即從可以「編譯」SQL的表達式中,您所要求的類似於要求「SQL-to- LINQ編譯器「。

我對你的問題的建議是 - 把你的SQL查詢作爲視圖保存在數據庫中,然後將你的視圖映射到LINQ-to-SQL .dbml文件中,並在其上添加你的LINQ查詢。

context.viewSavedFromYourSql.Where(x => x.Name.Contains("Anonymous")).Take(20); 

這樣LINQ將從您的視圖中查詢,並只返回您需要的數據。

(你也可以使用表值函數,而不是觀點)

2

[意見]

不可能沒有大量的努力。

你似乎要求的是一個sql-> sql模型記號器或一個完整的sql-> IQueryable記號器,這兩者都是很大的努力實現。

我的建議是要麼寫一個粗略的SQL解析器,然後只需要放入所需的語句,或將您的視圖重寫爲LinqToDatabase查詢。

作爲創建IQueryable表達式的解釋,其表達式樹是查詢的對象邏輯,然後您的提供者將採用該邏輯並嘗試將其映射到一系列要執行的sql語句以及結果的映射器。您似乎在詢問相反的內容,因此您希望將一系列sql語句翻譯回表達式樹中。

這對我來說似乎有點雙重功,因爲你會映射到表達式樹中,追加到表達式上,然後映射回來。不僅僅是因爲完美的地圖可能不可能,所以你會發現你會得到相同的結果,但不是你想要的結果。

2

你可能想看看Linker

它將SQL語句轉換爲LINQ語句。很明顯,它不能轉換所有類型的SQL查詢,但如果要將所有硬編碼的SQL查詢轉換爲LINQ語句,它可以幫助你很多。

對不起,如果它不是免費的!

1

要查看在Visual Studio中生成的SQL,設置斷點,將鼠標光標移動到變量(LINQ查詢不應以.ToList()或ToArray())結尾或使用此方法How to view LINQ Generated SQL statements?。要將sql轉換爲linq,請看這裏:http://www.sqltolinq.com/

您可以創建快速和高質量的存儲過程,並將其添加到數據上下文以供在linq查詢中使用。