我有一个使用Kendo Grids显示数据的ASP.NET应用程序。我正在尝试为用户创建一种动态创建自己的网格的方式,以显示他们想要的数据库中任何数据(当然,在限制范围内)。
出现问题是因为在编译时我不知道用户要在哪个表上查询。对于类似但静态的网格,我使用System.Linq.IQueryable对象,如下所示:
IQueryable<v_InvCountLine> query;
query = from w in dc.v_InvCountLines
where w.BatchNum == batchNum && w.StoreRoom == storeroom && w.Serialized == 0
select w;
//where v_InvCountLines is the name of a database table(view).
我想完成类似的事情,但是查询由用户传入的字符串确定的表。
我已经从this question创建了一个这样的对象,但是它是object类型的,因此它无法访问我实际进行工作所需的任何方法。
//WOLinq is the name of a database table
Type objectType = Type.GetType("WOLinq");
Type type = typeof(IQueryable<>).MakeGenericType(objectType);
object query = Activator.CreateInstance(type);
是否有一种方法可以将query
转换为实际类型,还是可以通过其他方式动态选择要使用IQueryable <>查询的表?
答案 0 :(得分:1)
如果我们谈论的是带有Entity Framework 6的ASP.NET应用程序,那么最好的解决方案是使用原始SQL查询。例如:
Type entityType = Type.GetType("YourAppNamespace.Models." + typeNameYouGotFromUser);
string tableName = GetTableName(entityType, _dbContext);
var sql = $"SELECT * FROM [{tableName}] WHERE " + SomeOtherConditions;
var list = _dbContext.Database.SqlQuery(entityType, "SELECT * FROM Orders");
foreach (var record in list) {
//do whatever you need with record
}
GetTableName
是您可以从this post获得的功能
当然,您可以将我们的EasyQuery library用于此类任务。