如何在实体框架中编写动态SQL查询?
问题描述:
我有一个页面,用户可以输入一个SQL查询。此查询可以针对我数据库中的任何表。我需要对相应的表执行此查询并在我的视图中显示结果。这个怎么做?如何在实体框架中编写动态SQL查询?
例如:用户可以输入Select * from ABC
或select 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.
无论结果如何,我应该能够把它传递给视图,并显示它。
请帮忙。
答
可以使用
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; }
}
VAR博客= context.YourModel.SqlQuery(“SELECT * FROM DBO。 YourTable“)ToList(); – MstfAsan
我无法指定'myModel',因为我不知道用户可能输入什么作为查询。所以无论是我需要执行的模型。 – Shafeek
让用户直接对数据库执行任何SQL可能是一个非常糟糕的主意。 – Wurd