2016-12-01 8 views
1
private decimal GetBankAccountCashierTotal() 
{ 
    var company = _context.Company.FirstOrDefault(); 

    return _context.PersonBankAgencyAccount 
      .Where(p => p.PersonID.Equals(company.PersonID)) 
      .Where(c => c.BankAgencyAccountBalance 
       .Any(b => b.Reference <= DateTime.Now)) 
      .Select(x => x.BankAgencyAccountBalance 
       .Where(d => d.Reference.Date <= DateTime.Now) 
       .OrderByDescending(d => d.Reference) 
       .FirstOrDefault() 
       .CurrentBalance) 
      .sum(); 
} 

Это мой полный метод, при вызове этого метода я получаю исключениеLINQ к SQL, не может выполнить агрегатную функцию на выражение, содержащее совокупность или подзапрос

An exception of type 'System.Data.SqlClient.SqlException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code

и выход

Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler:Error: An exception occurred in the database while iterating the results of a query. System.Data.SqlClient.SqlException: Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

ответ

1

Хорошей новостью является то, что проблема не в вашем (абсолютно правильном) запросе LINQ.

Плохая новость заключается в том, что в настоящее время (v.1.1.0) перевод/обработка запроса EF Core LINQ по-прежнему является полным кошмаром. После большого количества проб и ошибок, получения либо неправильного SQL (следовательно, исключений SQL), либо различных внутренних исключений из инфраструктуры EF Core, только (!) способом Я смог получить желаемый результат с одним SQL, и никаких исключений не было следующим образом (должно быть написано точно таким образом):

return _context.PersonBankAgencyAccount 
     .Where(p => p.PersonID.Equals(company.PersonID)) 
     .SelectMany(p => _context.BankAgencyAccountBalance 
      .Where(b => b.AccountId == p.Id && b.Reference.Date <= DateTime.Now) 
      .OrderByDescending(b => b.Reference) 
      .Take(1)) 
     .Sum(b => b.CurrentBalance); 

конечно, так как с помощью свойства навигации не работает, я догадывался некоторые имена, вы можете заменить их с вашим, если это необходимо.

+0

Большое спасибо, это сработало отлично, но у меня все еще есть вопрос, разрешит ли я мне сделать этот тип запроса в запросе, который содержит подзапросы, или это проблема, возникающая из базы данных в том, что она не принимает этот тип запроса. –

+0

As Я упомянул в сообщении, это текущее ограничение/ошибка EF Core/неправильный перевод SQL. Например, EF6 не имеет проблем с переводом таких запросов (и многих других). –

+0

Проблема с этим кодом заключается в том, что он загружает информацию в базу данных, мне, вероятно, придется подождать, пока Microsoft оптимизирует переводы EFCore); –