2016-12-01 15 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は、これは私の完全な方法で集計を含む式に集約関数またはサブクエリ

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コアLINQクエリ変換/処理がまだ完全な悪夢であることです。多くの試行錯誤の後、不正なSQL(したがってSQL例外)またはEFコアインフラストラクチャからの異なる内部例外を取得した後、(!)私は単一の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

ありがとう、それは完全に機能しましたが、私はまだ質問がありますか、Microsoftはサブクエリを含むクエリでこのタイプのクエリを実行できるようにしますか、このタイプのクエリを受け入れないとデータベースから発生する問題です –

+0

私は記事で言及した、それは現在のEFコアの制限/バグ/誤ったSQL変換です。たとえば、EF6はそのようなクエリ(および他の多くのもの)を翻訳する際に問題はありません。 –

+0

このコードの問題は、データベースに情報をロードしていることです。マイクロソフトがEFCoreの翻訳を最適化するまで待つ必要があるかもしれません。 –

関連する問題