2014-02-22 63 views
1

我在讀那個linq是懶惰的,它沒有執行查詢,直到它需要。無連接使用Linq到Sql

如果這就是爲什麼這段代碼失敗的情況下:

var db = new Data.DataClasses1DataContext(@"Data Source=.\sqlexpress;Initial Catalog=MyDb;Integrated Security=True"); 

var companies = db.Customers.Where(x => x.Company=="Foo"); 

var query = companies.ToString(); 

如果我運行的計算機代碼,沒有SQL服務器上安裝它不會運行,爲什麼?我沒有做任何需要數據的陳述。如果我打電話給companies.ToList(),那麼它的代碼就會失敗。有沒有一種方法可以在不使用連接的情況下使用Linq to SQL Classes。我知道我做ToList()的那一刻,或者嘗試枚舉結果,我會得到一個錯誤。 我只是想使用Linq to Sql Classes來生成SQL語句並將它們看作字符串。

我有一個客戶端和服務器。服務器是WCF服務,客戶端是控制檯應用程序。如果用戶沒有輸入,我將發送加密查詢。我希望使用Linq to Sql classes來生成我的查詢,但它並沒有讓我必須在客戶端上安裝sql server,以便我可以生成查詢。


我的臨時解決方案是在同一臺服務器上創建第二個數據庫。該數據庫將被允許接受遠程連接和它的整個目的是使該行

變種分貝=新Data.DataClasses1DataContext(@「一些遠程連接字符串」);

工程。一旦我初始化該行,我將永遠不需要再次連接。這個不成立。

+2

我不相信company.ToString()會返回SQL查詢。它應該返回查詢的結果,在這種情況下它是IEnumerable 。ToString() – evanb

+0

如果您不知道如何編寫SQL語句,但您確實知道如何編寫Linq2Sql Lambda表達式,那麼使用[LINQPad](https://www.linqpad.net)這樣的產品會非常容易。 /)編寫代碼,然後查看SQL語句的外觀。 –

+0

'companies.ToString()'將生成sql語句。此外,我可以使用'DataContext.GetCommand'提取要在db上執行的sqlCommands。加上它的速度更快,更安全,我認爲用Linq構建查詢而不是將它們放入字符串中 –

回答

1

不生成查詢在客戶端上,然後通過SQL的服務。相反,在客戶端生成lambda表達式,然後將表達式發送到該服務。

請參閱 「How can I pass a lambda expression to a WCF service?」。

的一個問題,這將解決的是,數據庫和架構版本的。按照你的方式做,需要客戶端理解數據庫模式,甚至是數據庫版本,並且它與服務使用的相同(或兼容)。否則,你會被卡在客戶端上生成一個版本的SQL Server的SQL,然後發送到該服務上的另一個SQL Server版本(或等價地,不同的數據庫模式)。

1

的問題是在創建數據庫上下文對象的,而不是在LINQ聲明。具體來說,爲了創建數據庫上下文對象,你需要一個實際的連接字符串。如果你不提供一個,那麼你嘗試創建的數據庫上下文,我想它會是空的,否則你會得到一個異常。然後使用這個空對象定義你的linq查詢將會拋出一個異常,即使你的查詢沒有使用ToList(),它將定義強制執行你的linq查詢。

再次閱讀您的文章我相信您應該在連接字符串中定義安裝在服務器中的sql express服務器,該服務器將託管WCF服務。然後,具有此連接字符串的客戶端將能夠調用您的服務器數據庫。

+0

如何僞造db上下文的創建?我永遠不會使用它 –

+0

這個[XY問題]的氣味(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你想通過僞造你不會用到的東西來解決什麼問題?如果你不打算使用它們,創建SQL語句的目的是什麼? –

+0

我不知道如何生成SQL語句,因此我想使用linq。我想使用linq to sql類來生成sql語句。然後我會把這些交給wcf服務。我永遠不會執行客戶端中的這些狀態 –