2012-01-17 22 views
3

これが尋ねられた場合は申し訳ありませんが、データベースを1回呼び出すだけで次のように改善するにはどうすればよいですか?単一のクエリで複数のエンティティフレームワーク

var statsModel = new 
{ 
    Total = _db.Messages.Count(), 
    Approved = _db.Messages.Count(x => x.Approved), 
    Rejected = _db.Messages.Count(x => !x.Approved), 
}; 
+0

少なくとも「拒否=合計 - 承認済み」 –

+0

私は簡単にすべてのメッセージを返すことができ、そこにフォームをフィルターにかけることができますが、何千ものメッセージがあるかもしれません。テーブル全体を返すことは、強烈なクエリになります。なぜそれだけカウントを返す必要があるのでしょうか。 – TYRONEMICHAEL

答えて

4

あなたは合計でRejectedを計算し、このように受理することができますまず第一に:

Rejected = Total - Approved 

そして、あなたは一発でそれらの両方を計算することができ、さらなる改善のために、

from m in _db.Messages 
let Total = _db.Messages.Count() 
let Accept = _db.Messages.Count(x => x.Approved == true) 
select new {Total , Accept}) 

UPDATE: 今の簡単なハック:ちょうど

(from m in _db.Messages 
let Total = _db.Messages.Count() 
let Accept = _db.Messages.Count(x => x.Approved == true) 
select new {Total , Accept}).Take(1); 

最初の行を取るしかし、私はこれが役立つかもしれないクリーナー1

+0

これに関連する最後の質問。正しく動作していますが、各メッセージに対して{Total、Accept}を返します。Total = _db.Messages.Count() Accept = _db.Messages.Count(x => x.Approved == true) 新しい{Total、Accept]を選択します。 })。FirstOrDefaul(); – TYRONEMICHAEL

5

を探しています:

var statsModel =(
     from message in _db.Messages 
     group message by 1 into g 
     select new 
     { 
      Total = g.Count(), 
      Approved =g.Count (x =>x.Approved), 
      Rejected =g.Count (x =>!x.Approved) 
     } 
    ).FirstOrDefault(); 
関連する問題