这里的问题是您的查询将被转换为SQL并在数据库上运行,并且Entity
framework不知道如何转换
Double.Parse为有效的SQL代码。但是,您可以定义一个自定义方法来进行解析,并告诉Entity
framework如何将该方法转换为SQL。这是怎么回事:
定义翻译
在文本编辑器中打开* .edmx文件,然后寻找
<edmx:ConceptualModels>标签。在此之下,您应该看到一个
<SchemaNamespace="YourModel" ...>标签。在Schema标记内,添加以下内容:
<Function Name="ParseDouble" ReturnType="Edm.Double"> <Parameter Name="stringvalue" Type="Edm.String" /> <Definingexpression> cast(stringvalue as Edm.Double) </Definingexpression> </Function>
这定义了您的自定义ParseDouble函数将转换为的Enity-SQL代码。
创建要翻译的方法
现在,我们需要在代码中定义一个匹配函数,然后将其放入LINQ语句中。您的EDMX文件用于生成从ObjectContext继承的部分类。由于它是局部类,因此可以在不触摸生成的代码的情况下向其中添加自己的方法-
只需确保类名匹配即可。
using System.Data.Objects.DataClasses;public partial class YourObjectContext{ /// <summary> /// This method exists for use in LINQ queries, /// as a stub that will be converted to a SQL CAST statement. /// </summary> [EdmFunction("YourModel", "ParseDouble")] public static double ParseDouble(string stringvalue) { return Double.Parse(stringvalue); }}现在,你可以回到你的LINQ语句,并替换的任何实例
Double.Parse用
YourObjectContext.ParseDouble。由于这是实际调用的实际方法
Double.Parse,因此可以在LINQ
to Objects调用上使用,并且由于它也在EDMX文件中定义,因此它也可以由LINQ to Entities转换为SQL。
但是,等等,您还没有完成!
我注意到您的LINQ语句还包含对的调用
Math.Round。我不知道Entity
framework是否包含该方法的翻译,但是如果不包含,则在为该方法修复该方法后,您将得到相同的错误
Double.Parse。幸运的是,针对这种情况的解决方案几乎完全相同,只是EDMX文件中定义的功能如下所示:
<Function Name="Round" ReturnType="Edm.Double"> <Parameter Name="input" Type="Edm.Double" /> <Definingexpression> Round(input) </Definingexpression> </Function>
您可以使用此EDM规范功能列表来查看将哪些有效内容放入
<Definingexpression>标签中。



