Entity framework 4 LINQ到实体字符串到双精度转换

Entity framework 4 LINQ到实体字符串到双精度转换,entity-framework-4,Entity Framework 4,我是第一次与LINQ to Entities合作 我的数据存储有一个字符串字段,根据某些其他字段的不同,它通常是一个整数。我无法更改此数据库的结构 EF中的表格是MasterData 我正在尝试根据基于varname字段的分组在varvalue字段中创建这些记录的总和,如下所示: var varsum = from md in context.masterdatas where md.imparcid == SelectedDataSet.imparcid &&

我是第一次与LINQ to Entities合作

我的数据存储有一个字符串字段,根据某些其他字段的不同,它通常是一个整数。我无法更改此数据库的结构

EF中的表格是MasterData

我正在尝试根据基于varname字段的分组在varvalue字段中创建这些记录的总和,如下所示:

var varsum = from md in context.masterdatas
             where md.imparcid == SelectedDataSet.imparcid && md.varname == t.VarName
             group md by md.varname into g
             select new { varname = g.Key, SummedAmt = g.Sum(md => Convert.ToDouble(md.varvalue)) };
我得到一个错误,LINQ to Entities无法识别方法Double ToDouble(系统字符串)

基于上述问题,我在EDMX模型中添加了一个定义表达式,并在datamodel的一个部分类中定义了函数,并使用以下代码:

var varsum = from md in context.masterdatas
             where md.imparcid == SelectedDataSet.imparcid && md.varname == t.VarName
             group md by md.varname into g
             select new { varname = g.Key, SummedAmt = g.Sum(md => context.ParseDouble(md.varvalue)) };
现在我得到一个错误,ParseDouble函数无法转换为LINQ to entities存储表达式

我真正想做的就是运行以下SQL语句:

SELECT [varname]
      ,[vartype]
      ,Sum(CASE WHEN Isnumeric([varvalue])=1 THEN cast([varvalue] as float) Else 0 END)
  FROM [masterdata]
  Group by varname, imparcid, vartype
  Having imparcid=25 AND varname = 'S2CMT8B'

我不知道实现这一点的最佳方法。

在LINQ查询的最后一行,您需要在您的上下文类上调用static
ParseDouble
方法,而不是
上下文
实例:

/。。。
选择新{varname=g.Key,SummedAmt=g.Sum(md=>
MyContextClass.ParseDouble(md.varvalue))};
//  ^^^^^^^^^^^^^^
//不是上下文实例,只是类名,因为ParseDouble是静态的
我认为只有在这种情况下,
EdmFunction
属性才是由EF处理的,否则它会像普通的.NET方法一样调用该方法,抛出异常

编辑

EdmFunction
属性中指定正确的模型名称空间也很重要。如果您的EDMX看起来像这样


铸造(stringvalue为Edm.Double)
。。。必须将架构
MyDBModel
的命名空间指定为
edmfonfictionAttribute
的第一个参数:

[EdmFunction(“MyDBModel”、“ParseDouble”)]
公共静态双精度ParseDouble(字符串stringvalue)
{
// ...
}

否则,
ParseDouble
将被视为正常的.NET方法,并导致无法将其转换为存储表达式的异常。

谢谢Slauma,但在进行此更改后,我仍然在类型“IFR\u Full.ifrenties”(即MyContextClass)上收到错误“指定方法”Double ParseDouble(System.String)当我单步执行代码并执行LINQ to Entities语句时,无法将其转换为LINQ to Entities存储表达式。@DeeDub84:您能检查上面的编辑部分吗?指定的命名空间错误会导致异常。