首页 > 解决方案 > 如何使用动态类型的 IQueryable?

问题描述

我有一个使用剑道网格来显示数据的 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).

我想完成类似的事情,但查询由用户传入的字符串确定的表。

这个问题我设法创建了这样一个对象,但它是对象类型,因此它无法访问我实际完成工作所需的任何方法。

//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<> 查询的表?

标签: c#asp.nettypeskendo-grid

解决方案


如果我们谈论的是带有 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是您可以从这篇文章中获得的功能

当然,您可以使用我们的EasyQuery 库来完成此类任务。


推荐阅读