如何使用动态类型的IQueryable?

时间:2019-07-04 21:37:07

标签: c# asp.net types kendo-grid

我有一个使用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 <>查询的表?

1 个答案:

答案 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用于此类任务。