2016-01-27 170 views
6

我想無法在實體框架

SELECT object_id 
    FROM sys.tables 
    WHERE sys.tables.name = 'Projects' 

int n = context.Database.SqlQuery<int>(
     "SELECT object_id from sys.tables where sys.tables.name = 'Projects'") 
     .FirstOrDefault(); 

我得到n個一如既往0

如果我使用SqlConnection和查詢執行以下查詢閱讀系統視圖它使用了一個SqlCommand我得到了正確的結果。那麼爲什麼DbContext.Database.Connection不讓我執行普通的SQL查詢?

爲簡單起見,我已經刪除了SqlParameter,所以我意識到此代碼不是SQL注入安全的。

+0

我認爲你的表名不存在。如果我運行查詢(將名稱更改爲有效的名稱後),它可以正常工作 –

回答

0

我認爲Database.SqlQuery結果應該先轉換爲列表:

試試這個:

int n = context.Database.SqlQuery<int>(
    "SELECT object_id from sys.tables where sys.tables.name = 'Projects'") 
    .ToList().FirstOrDefault(); 
+1

不,它不應該。從文檔'請注意,就像LINQ查詢一樣,查詢在枚舉結果之前不會被執行,調用'FirstOrDefault()'也會枚舉查詢 –

1

沒有與系統的觀點沒有問題,實體框架無法讀取SqlQuery類值類型。所以我不得不改變它,

public class SingleValue<T>{ 
    public T Value {get;set;} 
} 

int n = context.Database.SqlQuery<SingleValue<int>>(
    "SELECT object_id as Value from sys.tables where sys.tables.name = 'Projects'") 
    .ToList().Select(x=>x.Value).FirstOrDefault();