EntInCollection的MethodInfo而不是Queryable

时间:2009-01-14 14:36:14

标签: c# linq entity-framework reflection lambda

我手动创建等效的lambda:

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

我有一个MethodInfo引用,用于与代码内置的表达式一起使用的“Any”方法。

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方法。

2 个答案:

答案 0 :(得分:3)

EntityCollection<T>没有实现IQueryable<T>因此,这不起作用,IMO就不足为奇了。

你能否解释一下你想要做什么?如果您希望在数据库上运行查询,我的猜测是它真的不会支持(假设EntityCollection<T>没有实现IQueryable<T>)。如果您希望在本地运行查询,则应使用Enumerable.Any而不是Queryably.Any。

编辑:看过更新后的集合,我相信你只想要Enumerable.Any而不是Queryable.Any。不要忘记,如果将其作为表达式树提供,那么您实际上并不会执行该代码。据推测,框架理解Enumerable.Any应用于EntityCollection<T>

答案 1 :(得分:0)

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