2015-08-03 5 views
0

У меня есть SQL-запрос, который отлично работает в SQL Server. который являетсяОбщая сумма с несколькими предложениями LINQ

SELECT sum(CONVERT(float,[amount])) 
FROM [transaction] 
where [response_code] = '100' and merchant_id = '14 

при преобразовании его в linq это был мой результирующий запрос и исключение, которое я получал. Что я делаю не так?

LINQ =

float count = dbContext.transactions.Where(trx => trx.response_code.Equals("100")) 
          .Where(trx=>trx.merchant_id.Equals(mid)) 
          .Sum(i => float.Parse(i.amount)); 

Ошибка =

{System.InvalidOperationException: Could not translate expression 'Table(transaction).Where(trx => trx.response_code.Equals("100")).Where(trx => trx.merchant_id.Equals(Convert(Invoke(value(System.Func`1[System.Nullable`1[System.Int32]]))))).Sum(i => Parse(i.amount))' into SQL and could not treat it as a local expression. 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.Generator.Generate(SqlNode node, LocalBuilder locInstance) 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.Generator.GenerateBody(ILGenerator generator, SqlExpression expression) 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.CompileDynamicMethod(Generator gen, SqlExpression expression, Type elementType) 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.Compile(SqlExpression expression, Type elementType) 
    at System.Data.Linq.SqlClient.SqlProvider.GetReaderFactory(SqlNode node, Type elemType) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector) 
    at WCF_SOAP_REST_Service.Service.totalAcceptedTransactionCount(Nullable`1 mid) in c:\Users\Monet\Documents\Visual Studio 2012\Projects\WCF_SOAP_REST_Service\Service.svc.cs:line 845} 
+0

Попробуйте использовать 'плыви; float.TryParse ("value", out a); ' – Karthik

+0

Вы пытались использовать == вместо вызовов функции .Equal? – KnightFox

ответ

1

Проблема заключается в том, что Linq To Entities не распознает метод float.Parse() и не может перевести его в действительное заявление магазине ,

Вы должны перечислить сначала Где результат с методами Select(), AsEnumerable(), ToList() ...

Здесь у вас есть методы, которые Linq к Entities могут перевести в действительное Sql заявление:

CLR Method to Canonical Function Mapping

Это должно работать:

dbContext.transactions.Where(trx => trx.response_code.Equals("100")) 
    .Where(trx=>trx.merchant_id.Equals(mid)) 
    .ToList() // Or AsEnumerable(), or Select()... 
    .Sum(i => float.Parse(i.amount)); 
+0

'Select' не перечисляет оператор LINQ to Entities. 'Count' будет, хотя –

+0

спасибо, что он работал – Shauzab

Смежные вопросы