MethodInfo 用于 EntityCollection 而不是 Queryable

Posted

技术标签:

【中文标题】MethodInfo 用于 EntityCollection 而不是 Queryable【英文标题】:MethodInfo for EntityCollection instead of Queryable 【发布时间】:2010-10-01 09:16:15 【问题描述】:

我正在手动创建等效的 lambda:

var function = p => p.Child.Any(c => c.Field == "value");

我有一个 MethodInfo 引用,指向与内置代码中的表达式一起使用的“任何”方法。

MethodInfo method = typeof(Queryable).GetMethods()
        .Where(m => m.Name == "Any" && m.GetParameters().Length == 2)
        .Single().MakeGenericMethod(typeof(Child));

我的实体是: 父 1---* 子

Child 是 Parent 上的导航属性(上述 lambda 中的 p)。属性的类型是设计者创建的 EntityCollection。

我正在寻找正确的方法来引用 Any 方法来创建该调用。 Marc 给了我如何在这里得到这个的答案:Calling a Method from an Expression

但它不适用于实体框架。 EntityCollection没有实现IQueryable,那么Any方法应该怎么引用呢。

【问题讨论】:

【参考方案1】:

EntityCollection<T> 没有实现 IQueryable<T>,所以这不起作用并不奇怪,IMO。

您能否详细说明您正在尝试做什么?如果您希望查询在数据库上运行,我的猜测是它真的不支持它(鉴于EntityCollection<T> 没有实现IQueryable<T>)。如果您希望查询在本地运行,则应使用 Enumerable.Any 而不是 Queryably.Any。

编辑:看到更新的集合后,我相信您只需要 Enumerable.Any 而不是 Queryable.Any。不要忘记,如果这是作为表达式树提供的,那么无论如何您实际上都不会执行该代码。大概框架理解 Enumerable.Any 应用于EntityCollection<T>

【讨论】:

我的答案太大,无法发表评论,请在下面查看我的答案。 请编辑问题以澄清它,而不是添加“未回答”。 我已经更新了原始问题并进行了澄清,谢谢【参考方案2】:

您可以使用 AsQueryable() 扩展方法将 EntityCollection 转换为 IQueryable。

【讨论】:

以上是关于MethodInfo 用于 EntityCollection 而不是 Queryable的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MethodInfo 创建 Action 委托?

MethodInfo.Invoke 与 Type.InvokeMember?

如何获取 Java 8 方法参考的 MethodInfo?

命令绑定无法将“System.Reflection.RuntimeEventInfo”类型的对象转换为“System.Reflection.MethodInfo”类型

文本框绑定无法将“System.Reflection.RuntimeEventInfo”类型的对象转换为“System.Reflection.MethodInfo”类型

AS3 - TypeError:MethodInfo 中的错误 #1009 “null”