代码之家  ›  专栏  ›  技术社区  ›  blu

用于EntityCollection而不是Queryable的MethodInfo

  •  0
  • blu  · 技术社区  · 15 年前

    我正在手动创建等效lambda:

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

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

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

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

    子级是父级(上面lambda中的p)的导航属性。属性的类型是由设计器创建的EntityCollection。

    我正在寻找适当的方法来引用任何创建该调用的方法。马克给了我一个如何在这里得到这个的答案: Calling a Method from an Expression

    但它不适用于实体框架。EntityCollection不实现IQueryable,因此应如何引用任何方法。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Jon Skeet    15 年前

    EntityCollection<T> 不执行 IQueryable<T> 所以这不起作用也就不足为奇了,我的意思是。

    你能解释一下你想做什么吗?如果您希望查询在数据库上运行,我想它实际上不支持这个(假设是这样的话) 实体集合<t> 不执行 可查询 )如果希望在本地运行查询,则应使用Enumerable.Any而不是Queryly.Any。

    编辑:看到更新的集合后,我认为您只需要Enumerable.Any而不是Queryable.Any。别忘了,如果这是作为表达式树提供的,那么实际上 执行 不管怎样,那代码。假设框架理解Enumerable.Any应用于 实体集合<t>

        2
  •  0
  •   mike    15 年前

    可以使用asqueryable()扩展方法将EntityCollection强制转换为iQueryable。