У меня есть таблица, которая выглядит так:
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; }
}
Я не уверен на 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 не распознает метод метода Double 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 to Entities не распознает метод метода System.String ToString (), и этот метод нельзя преобразовать в выражение хранилища.
Итак, я изменил функцию в XML-файле .edmx так:
<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.
Я близко, или я делаю это совершенно неправильно ...?
Заранее спасибо