2010-10-18 71 views
2

我正在使用C#和WPF作爲前端的EF。我需要提供一個UI,以便用戶可以創建自己的查詢並獲得結果。用戶界面將列出表格和列表以供選擇(不滿意用戶界面,需要改進,但在我的腦海中需要新的刻度)。如何在EF上運行SQL查詢?

所以我的問題是如何創建,合併(現有查詢)和執行查詢。

還有sql類實體客戶端提供程序,objectquery類。我用ObjectQuery

string querystring = @"SELECT PrjDev FROM prjscenario"; 
ObjectQuery<PrjDev> prjdevquery = new ObjectQuery<PrjDev>(querystring, ptxobjcontext); 
string cpmmandtext = prjdevquery.CommandText; 
int prjdevnum = prjdevquery.Count(); 

它正在工作。但是,當我運行一些複雜的查詢。它不工作。示例代碼:

string querystring = @"SELECT PrjDev FROM prjscenario WHERE PrjDev.PrjDevType = 10"; 

錯誤:

'PrjDevType' 不是 「Transient.collection的成員[Skm.Ptx.Data.Emf.PrjDev(可空=真,默認值=)] 」。 要提取元素的集合 的屬性,請使用子查詢在集合上迭代 。近簡單 標識,第1行,列45

任何想法,爲什麼它是很好的一個簡單的查詢,但它不是爲複雜的查詢工作?

由於事先 ñ

回答

11

作爲參數的構造函數ObjectQuery<T>通過查詢不是SQL查詢,這是一個ESQL(實體SQL)查詢。雖然語法相似,但它們是非常不同的語言。您可以瞭解有關ESQL on this page的更多信息。

如果要執行真正的SQL對ObjectContext中的底層數據庫,你可以使用ObjectContext.ExecuteStoreQuery方法,或者只是檢索通過ObjectContext.Connection屬性的連接,並從那裏寫上「經典」的ADO.NET代碼。

+0

您好托馬斯,我在看ExecuteStoreQuery和E SQL。 First ExecuteStoreQuery對我來說看起來不錯。它完美的與簡單的查詢。但是,當我通過三個表聯合傳遞複雜的查詢。它因錯誤而中斷,如數據讀取器與指定的'Emf.PrjDevCable'不兼容。類型成員'PrjDevID'在數據讀取器中沒有相應的列,名稱相同。 – 2010-10-19 18:11:46

+0

它不適用於匿名類型,僅適用於命名類型(因爲您不能將匿名類型指定爲泛型類型參數)。查詢需要返回與您的模型相同的列名稱 – 2010-10-19 22:04:54

+0

謝謝。我解決了問題來到這裏回答我看到你的帖子。我做了同樣的事情。我正在使用Select Name,Type From Table Joins .....現在我使用Select * From Table Join ....在一個簡短的說明中,L2S支持兩者。但EMF只適用於Select * ....謝謝,N – 2010-10-19 22:59:16