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.Invoke 与 Type.InvokeMember?
命令绑定无法将“System.Reflection.RuntimeEventInfo”类型的对象转换为“System.Reflection.MethodInfo”类型
文本框绑定无法将“System.Reflection.RuntimeEventInfo”类型的对象转换为“System.Reflection.MethodInfo”类型