2011-10-14 201 views
2

我有一個表,如下所示:解決方法「LINQ到實體無法識別方法‘的Int32解析(System.String)’

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

它有它的其他列(等),但我有我要運行一些項目統計數據的特定查詢的SQL查詢應該是這樣的:

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

所以,我創建了一個演示模型類來保存數據,這樣我就可以返回給客戶端

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

我不是100%確定如何執行相同的查詢在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實體無法識別方法「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(布爾)'不能被轉換成LINQ to Entities存儲表達式。

我結束了,還是我這樣做完全錯了......?

在此先感謝

回答

2

如果巴茲是有點,你可以添加一個地方,然後只用計數(),如下

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(); 
+0

感謝@Steven,這個完美的作品 - 不知道爲什麼我忽視伯爵 - 這是漫長的一天:) – zenocon

相關問題