“LINQ to Entities无法识别方法'Int32 Parse(System.String)'的解决方法

时间:2011-10-14 04:13:30

标签: c# linq entity-framework

我有一张看起来像这样的表:

Foo
 FooId : int (PK)
 BarId : int
 Baz   : bit
 etc.

它有其他列(等),但我有一个特定的查询,我想运行它来预测一些统计信息。 SQL中的查询如下所示:

SELECT 
 BarId, 
 SUM(CAST(Baz AS INT)) AS BazCount
 FROM Foo GROUP BY BarId;

因此,我创建了一个Presentation Model类来保存数据,因此我可以将其返回给客户端。

public partial class FooStatistics
{
  public int BarId { get; set; }
  public int BazCount { get; set; }
}

我不是百分百确定如何在LINQ中执行相同的查询并将其投影到此对象中,但我给它一个这样的镜头:

FooStatistics stats = (
    from f in ctx.Foo
    where <clauses here>
    group f by f.BarId
      into StatsGroup
      select new FooStatistics() {
        BarId = StatsGroup.Key,
        BazCount = StatsGroup.Sum(f => Int32.Parse(f.Baz.ToString()))
      }
    ).FirstOrDefault();

这会引发错误:

LINQ to Entities无法识别方法'Int32 Parse(System.String)'方法,并且此方法无法转换为商店表达式。

所以,我按照这里给出的建议:

LINQ to Entities does not recognize the method 'Double Parse(System.String)' method, and this method cannot be translated into a store expression

我将此添加到我的.edmx XML

<Function Name="ParseInt" ReturnType="Edm.Int32">
  <Parameter Name="value" Type="Edm.String" />
  <DefiningExpression>
     cast(value as Edm.Int32)
  </DefiningExpression>
</Function>

然后我添加了一个部分类来定义方法:

public partial class MyEntities
{
   [EdmFunction("MyEntities", "ParseInt")]
   public static Int32 ParseInt(string value)
   {
       return Int32.Parse(value);
   }
}

我将LINQ更改为:

FooStatistics stats = (
    from f in ctx.Foo
    where <clauses here>
    group f by f.BarId
      into StatsGroup
      select new FooStatistics() {
        BarId = StatsGroup.Key,
        BazCount = StatsGroup.Sum(f => MyEntities.ParseInt(f.Baz.ToString()))
      }
    ).FirstOrDefault();

但这会爆发:

LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式。

因此,我将.edmx XML中的函数更改为:

<Function Name="BoolToInt32" ReturnType="Edm.Int32">
   <Parameter Name="value" Type="Edm.Boolean" />
   <DefiningExpression>
      cast(value as Edm.Int32)
   </DefiningExpression>
</Function>

然后我相应地将我的静态ParseInt更改为BoolToInt32并且我更改了LINQ以使用该功能,但现在它爆炸了:

指定的方法'Int32 BoolToInt32(Boolean)'无法转换为LINQ to Entities存储表达式。

我是否接近,或者我完全错了......?

提前致谢

1 个答案:

答案 0 :(得分:2)

如果Baz有点,你可以添加一个地方然后只使用如下的Count()

FooStatistics stats = (
    from f in ctx.Foo
    where <clauses here>
       and f.Baz
    group f by f.BarId
      into StatsGroup
      select new FooStatistics() {
        BarId = StatsGroup.Key,
        BazCount = StatsGroup.Count()
      }
    ).FirstOrDefault();