2014-02-26 79 views
3

我正在使用實體框架數據庫第一個模型,並且在查詢我的數據庫時遇到問題。實體框架SQL查詢未返回結果

我嘗試使用下面的代碼:

var ctx = new dbEntities(); 
    var description = ctx.DEPARTMENTs.SqlQuery("SELECT DESCRIPTION FROM DEPARTMENT WHERE DEPARTMENT='FINANCE'"); 
    System.Diagnostics.Debug.WriteLine(description); 

我可以看到我的結果在調試日誌Departments表的表,但由於某種原因SQL查詢只是返回我「選擇從控制檯中的DEPARTMENT ='FINANCE'「的描述而不是執行查詢,任何人都知道爲什麼?

乾杯

+0

你基本上在做'description.ToString()',它返回查詢的字符串表示形式。 –

+0

如果某人的答案解決了您的問題,您可能需要接受它作爲答案。 –

回答

4

爲了使查詢執行對供應商,你必須使用從IEnumerableToList()First()FirstOrDefault()

現在你要考慮幾件事情產生的任何擴展。你的查詢可能會返回什麼?數據列表或單個數據?或者,即使找到了一個匹配列表,你只需要一個?

從您的查詢的語法我認爲你應該這樣做:

var ctx = new dbEntities(); 
var dep = ctx.DEPARTMENTs 
      .SqlQuery("SELECT * FROM DEPARTMENT WHERE DEPARTMENT='FINANCE'") 
      .FirstOrDefault(); 

if(dep!=null) 
{ 
    var description = department.Description; 
} 

或者,你也可以做到這一點(我喜歡):

var description = ctx.DEPARTMENTs.Where(s=>s.Department.ToUpper() =="FINANCE") 
        .Select(s=>s.Description) 
        .FirstOrDefault(); 
+0

這很好 - 我喜歡這個答案,我怎麼能在select語句中選擇額外的參數,比如說我想選擇Description和ID – MattTheHack

+1

ohh,很簡單,這樣做'.Select(s => new {s.Description,s.ID,s.WhateverElseAvailable}) ' –

3

嘗試:

var description = ctx.DEPARTMENTs.SqlQuery<string>("SELECT DESCRIPTION FROM DEPARTMENT WHERE DEPARTMENT='FINANCE'").ToList(); 

編輯:原始的SQL查詢 http://msdn.microsoft.com/en-us/data/jj592907.aspx

需要注意的是,只是作爲一個LINQ查詢,不執行查詢,直到結果被列舉在上面的例子中,這是通過調用ToList完成的。

System.Diagnostics.Debug.WriteLine(Object)將對象的ToString方法的值寫入Listeners集合中的跟蹤偵聽器。 Debug.WriteLine(Object)

+0

感謝您的回覆 - 雖然我收到以下錯誤:「非泛型方法'...'.SQLQuery(字符串,params對象[])不能用於類型參數 – MattTheHack

1

SqlQuery回報DbSqlQuery<TEntity>對象。在你的情況下,它可能是DbSqlQuery<DEPARTMENTs>。由於文件說

代表該從 System.Data.Entity.DbContext創建,並使用從 這方面的連接,執行實體SQL查詢。此類的實例從實體類型的 System.Data.Entity.DbSet實例中獲取。創建此對象時,不會執行 查詢;它每次執行 時間,例如通過使用foreach。使用 System.Data.Entity.DbContext.Database創建對 非實體的SQL查詢。對於此類的非通用版本 ,請參見 System.Data.Entity.Infrastructure.DbSqlQuery。

請注意線路

創建該對象時不執行查詢;每次枚舉時都會執行 ,例如使用foreach。

這意味着你必須迭代它才能得到結果。