我正在使用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部分,但我找不到问题。
答案 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)