Обходной путь для «LINQ to Entities не распознает метод Int32 Parse (System.String)» - PullRequest
2 голосов
/ 14 октября 2011

У меня есть таблица, которая выглядит так:

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.

Я близко, или я делаю это совершенно неправильно ...?

Заранее спасибо

1 Ответ

2 голосов
/ 14 октября 2011

Если Baz немного, вы можете добавить where, а затем просто использовать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...