【问题标题】:Imported function in Entity Framework Where clause?实体框架Where子句中的导入函数?
【发布时间】:2009-06-30 06:04:01
【问题描述】:

是否可以在实体框架的 where 子句中使用函数导入?我尝试了以下方法,但我得到了一个相当神秘的异常,我找不到任何关于它的信息:

var q = MyContext.MyEntities.Where("MyContext.MyFunction(it.ID)")

(该函数设置为返回布尔值)

System.Data.EntitySqlException: 'MyContext.MyFunction' 无法解析为有效的类型构造函数或函数。在 WHERE 谓词附近,第 6 行,第 21 列..

问候

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    您尝试编写的查询正在组合对 FunctionImport 的调用以及对 EntitySet 的查询。

    但是因为 FunctionImports 是 StoredProcedures 的包装器,它们是不可组合的,所以这行不通。

    为了使这样的事情起作用,理论上该函数需要封装一些可组合的东西,如 TVF(表值函数)。但不幸的是,目前实体框架不支持 TVF。

    亚历克斯

    【讨论】:

    • 感谢 Alex - 为我回到绘图板!在我的模型中,每个实体都引用另一个实体 - A 引用 B,C & D 引用 E,B & E 引用 F 等。我想找到最终(直接和间接)引用另一个实体的所有实体。我有一个 sproc 可以查找引用以查找实体最终是否引用了我正在寻找的那个。 SQL 很简单,在 EF 中很难 :( 你对我能做什么有什么建议吗?我可以编写返回实体的存储过程并只是“函数导入”它们,但是使用大量存储过程很容易变得笨拙。李跨度>
    【解决方案2】:

    我认为您不想将此表达式作为字符串传递。你想要一个合适的 lambda 表达式,比如:

    MyContext.MyEntities.Where(entity => MyContext.MyFunction(entity.ID));

    【讨论】:

    • 感谢 Jeremy - 但是,由于该函数没有返回实体(只是一个布尔值),它在 MyContext 类中不存在(尽管我可以通过 EntityClient 成功调用它)。
    • 嗯,它存在于哪里?只需在 => 的右侧调用它,就像在其他任何地方一样。
    • 它不作为实体框架生成的 DataContext 对象的成员存在),因为它不是实体返回函数 - 它是布尔返回。
    • 查看 Where 扩展方法 [1] 的文档。 Where 方法接受一个函数(委托),该函数接受一个类型化的实体并返回一个布尔值。我提供的 lambda 表达式(修改为语法正确,因为您指出它存在于 MyContext 以外的其他地方),将作为 Where 方法的过滤器工作得很好,结果将是“通过“过滤器。 [1]msdn.microsoft.com/en-us/library/…
    • 但这会导致在客户端评估 where 子句,不是吗?
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多