如何在实体框架中编写动态SQL查询?

问题描述:

我有一个页面,用户可以输入一个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

可以使用

SqlQuery<dynamic>" 

这将解决该错误,但你将只能得到结果的计数返回。所以你可以验证查询返回了一些数据。但仍然需要知道返回数据的类型。

这是一个提供用户输入数据库查询的风险。

错误消息正好指出了问题:

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; } 
}