Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用反射获取linq查询中的选择字段_Linq_Entity Framework_Reflection - Fatal编程技术网

使用反射获取linq查询中的选择字段

使用反射获取linq查询中的选择字段,linq,entity-framework,reflection,Linq,Entity Framework,Reflection,我正在使用Linq进行查询,并且希望能够获得我希望使用反射在“选择”部分返回的属性列表。我尝试了以下方法,但没有效果: string[] paramList = new[]{"AppId","Name"}; var query = from entity in _ctx.App select new {entity.GetType().GetProperties().Where(prop=&g

我正在使用Linq进行查询,并且希望能够获得我希望使用反射在“选择”部分返回的属性列表。我尝试了以下方法,但没有效果:

string[] paramList = new[]{"AppId","Name"};
var query =
                from entity in
                    _ctx.App
                select new {entity.GetType().GetProperties().Where(prop=>paramList.Contains(prop.Name) )};

我在这里遗漏了什么?

我不相信你能以你现在的方式实现你想要的。为了创建匿名类型,必须在编译时知道该类型的形状(即属性)。您最好手动构建select表达式(使用
System.Linq.Expressions
中的表达式API),然后将您在代码中构建的表达式传递到
select()
扩展方法中(不要像示例中那样使用声明性查询语法)

最终,如果您能够实现这一点,那么很可能需要使用反射来访问您正在获取的集合项中的任何内容,因为在运行时之前您不知道它将保存什么


您不想返回整个对象有什么原因吗?

在EF查询中处理反射时,您需要自己编写表达式。有关更多信息,请查看这些现有问题


问题不在于Linq本身,而是因为您的查询被解析为一个表达式树,而Entity Framework不理解它。

实际上您是对的,select只是结果集上的一个投影,对吗?它与查询的性能(返回的数据量)无关。我试图过滤select子句以限制从查询中返回的内容,因为我只想处理某些属性。投影是否影响数据库查询完全取决于Linq提供程序。我知道Entity Framework(以及至少一个NHibernate Linq实现)确实考虑了select语句,并将尝试编写生成的SQL语句,以仅提取所需的内容(如果无法做到这一点,将抛出异常),但除非您谈论的是大量的数据,这样我就不用担心优化到那个水平了。