1

我正在使用 EF4,dotnet 4。我想创建一个 edmx 函数来帮助我从 xml 列 (SQLServer 2008R2) 获取 xml 值。我的问题与发布在Entity Framework Query Xml上的问题基本相同

我首先在我的 C# 文件中创建函数,如下所示:

    [System.Data.Objects.DataClasses.EdmFunction("ModelNamespace", "String_XmlField")]
    public static String XmlField(this String data, String path)
    {
        throw new Exception("Not implemented");
    }

下一部分进入了我的 edmx(正确的 csdl 模式):

    <Function Name="String_XmlField" ReturnType="Edm.String">
      <Parameter Name="data" Type="Edm.String" />
      <Parameter Name="path" Type="Edm.String" />
      <DefiningExpression>
        data.value(path, "nvarchar(max)")
      </DefiningExpression>
    </Function>

我正在尝试像这样使用它:

source = source.Where(x => x.NewData.XmlField("(//IDPat/node())[1]") == "3152");

我得到的错误是:“准备函数'ModelNamespace.String_XmlField'的定义时发生错误。有关详细信息,请参阅内部异常。”,带有消息“'value'不是类型的成员'的内部异常当前加载的模式中的 Edm.String'。靠近简单标识符,第 2 行,第 18 列。

我很确定错误在于原始响应中缺少 edmx 部分,但我找不到问题。

4

1 回答 1

0

您似乎已将 T-SQL 命令放入 CSDL。在 CSDL 中,您的数据库被抽象化,而 EF 不“知道”(也不关心)您的后端是什么。DefiningExpression 是 Entity SQL 中的表达式 - http://msdn.microsoft.com/en-us/library/bb387145.aspx - 而不是特定于数据库的任何 SQL 方言。在此级别,字符串类型是来自 EDM 类型系统(表示为 Edm.String)的类型,它不具有函数的 .value 属性。(实际上它没有任何属性或功能)。如果您需要使用 Sql 方言定义的存储特定函数,数据库正在使用您需要将其存储在 SSDL 函数元素中 - http://msdn.microsoft.com/en-us/library/dd283136(v=VS.90 )

于 2012-10-05T19:23:12.197 回答