EF4包装函数从XML字段获取值

时间:2012-10-03 08:52:07

标签: c# xml entity-framework-4

我正在使用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 =&gt; x.NewData.XmlField(“(// IDPat / node())[1]”)==“3152”);

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

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

1 个答案:

答案 0 :(得分:0)

您似乎已将T-SQL命令放入CSDL中。在CSDL中,您的数据库被抽象化,EF不知道&#34;知道&#34; (而且不关心)你的后端是什么。 DefiningExpression是实体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