2016-09-22 87 views
0

我有一個頁面,用戶可以輸入一個SQL查詢。此查詢可以針對我數據庫中的任何表。我需要對相應的表執行此查詢並在我的視圖中顯示結果。這個怎麼做?如何在實體框架中編寫動態SQL查詢?

例如:用戶可以輸入Select * from ABCselect max(price) from items

我想:

var results = DbContext.Database.SqlQuery<string>(query).ToList(); 

但是,這將引發一個錯誤:

The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types.

無論結果如何,我應該能夠把它傳遞給視圖,並顯示它。

請幫忙。

+0

VAR博客= context.YourModel.SqlQuery(「SELECT * FROM DBO。 YourTable「)ToList(); – MstfAsan

+0

我無法指定'myModel',因爲我不知道用戶可能輸入什麼作爲查詢。所以無論是我需要執行的模型。 – Shafeek

+0

讓用戶直接對數據庫執行任何SQL可能是一個非常糟糕的主意。 – Wurd

回答

0

可以使用

SqlQuery<dynamic>" 

這將解決該錯誤,但你將只能得到結果的計數返回。所以你可以驗證查詢返回了一些數據。但仍然需要知道返回數據的類型。

這是一個提供用戶輸入數據庫查詢的風險。

0

錯誤消息正好指出了問題:

The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types.

要解決這個問題,你可以提交從數據庫中返回一個字符串列SQL字符串,或提供一個類型參數,使EF到映射多個列。

例如:

SELECT someStringColumn FROM ABC 

OR

var results = DbContext.Database.SqlQuery<MyDto>(query).ToList(); 

凡MyDTO看起來是這樣的:

class MyDto 
{ 
    public int AddressID { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 
}