C# 使用反射在DbContext上编写等效LINQ查询缺少where条件
我似乎无法在LINQ查询的反射中创建等效的查询 目标是在实体框架DBContext上运行查询,但指定Tablename和where子句。有几个表,所以我不想为不同的表复制/粘贴相同的LINQ 下面的代码与LINQ一起工作,但是反射等效(尽管我将其转换为C# 使用反射在DbContext上编写等效LINQ查询缺少where条件,c#,.net,entity-framework,linq,system.reflection,C#,.net,Entity Framework,Linq,System.reflection,我似乎无法在LINQ查询的反射中创建等效的查询 目标是在实体框架DBContext上运行查询,但指定Tablename和where子句。有几个表,所以我不想为不同的表复制/粘贴相同的LINQ 下面的代码与LINQ一起工作,但是反射等效(尽管我将其转换为System.LINQ.IQueryable),不允许我添加.where子句 我包括使用System.Linq在类中 我在stackoverflow中研究的示例公开了Where()子句 可能是我忽略了一些次要的东西。(缺少参考资料?) 您需要强制转
System.LINQ.IQueryable
),不允许我添加.where
子句
我包括使用System.Linq代码>在类中
我在stackoverflow中研究的示例公开了Where()子句
可能是我忽略了一些次要的东西。(缺少参考资料?)
您需要强制转换到IQueryable
是一种扩展方法,适用于IQueryable
,而不是IQueryable
,从技术上解决了问题。但是,我首先使用反射的原因是传递任何表名(所有表都具有相同的结构)。我可以使用foreach(anyDbSet中的对象实体)
循环遍历结果集,然后对结果进行过滤,但初始结果集很大。我可以考虑不同的方法吗?你可以避免铸造,而用反射来调用<代码>可查询。在哪里<代码>。您可以停止与类型系统的冲突,转而使用SQL字符串,最终需要从SQL调用某种类型的。您可以使用动态LINQ第三方库代码>路由,我需要将我的where子句
(谓词)定义为Lambda表达式,带有参数。。。。。(如果可能的话,我试图避免使用SQL字符串方法)
// Link to TREESTRUCTURES Database
var DaContext = new WebApplication7.Models.Db_Entities.TREE_STRUCTURESEntities();
DaContext.Database.CommandTimeout=300;
// This works 100% for "HEADCOUNT_NEW"
var daTreeLeaves = DaContext.HEADCOUNT_NEW
.Where(x => x.PARENT_COMPONENT == "" && x.COMPONENT_DESCRIPTION == "Headcounts")
.Select(x => new { x.COMPONENT, x.COMPONENT_DESCRIPTION })
.OrderBy(x => x.COMPONENT)
.ToList();
// Reflections! = This works - Selecting from "HEADCOUNT_NEW" or any other specified available table;
PropertyInfo dbsetinfo = DaContext.GetType().GetProperties().FirstOrDefault(p => p.Name.ToUpper().Equals("HEADCOUNT_NEW"));
// I can't seem to get the `.Where()` clause right here (although this code does return values :) )
// I omitted the Where here as it would not compile.
System.Linq.IQueryable anyDbSet = ((IQueryable)dbsetinfo.GetValue(DaContext));
// Below is my attempt (pseudocode), but the error
// "IQueryable does not contain a definition for Where" is returned by VStudio
System.Linq.IQueryable anyDbSet2 = ((IQueryable)dbsetinfo.GetValue(DaContext)).Where("Id=" + pseudocode);