c# - 如何使用动态类型的 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<> 查询的表?
解决方案
如果我们谈论的是带有 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 库来完成此类任务。
推荐阅读
- javafx - 阻止盒子移动
- excel - Excel公式查找值在按组动态范围内出现的次数
- python - tensorlayer Seq2seq模型中的model.train()函数有什么作用
- angular - Angular 元素自定义元素显示,但不显示项目中的其他组件
- java - PostgreSQL:错误:运算符不存在:整数 = 记录 - Spring JPA 数据
- usb - 使用 OmniDriver 通过 NetBeans 将 Java 代码远程部署到 Raspberry Pi(加载本机 USB 驱动程序时出错)
- r - 将数据集文件拆分为特定大小的部分
- java - 在 taskdef 级别运行 build.xml 时出现以下错误
- c# - 更新 SAML 令牌 - Owin/WsFederation
- arrays - SQL Server 2016:JSON 格式的数字数组