我有一個表,如下所示:解決方法「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)'方法,並且此方法不能轉換爲存儲表達式。
於是,我跟着這裏給出的建議是:
我將此添加到我的.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存儲表達式。
我結束了,還是我這樣做完全錯了......?
在此先感謝
感謝@Steven,這個完美的作品 - 不知道爲什麼我忽視伯爵 - 這是漫長的一天:) – zenocon