2012-02-08 11 views
4

プロパティとしてintを持ち、その関数がカウントを保持するオブジェクトを埋めるために使用するlinq-to-sqlクエリがあります。linq to sql where句と数え込み

問合せは、私はいくつかの問題が最初にフィルタリングしていることだし、それから、最初の句のフィルタリングされた結果に基づいてカウント

var TheQuery = from..... 
       where .... 
       in thefilteredresults 
       select new MyModel() 
       { 
        Total = thefilteredresults.Count(), 

        TotalTime = (from x in thefilteredresults 
           where x.Outcome == 4).Sum(t => t) 
       }.Single(); 

(今のところ)このようになります。 変更する必要はありますか?

ありがとうございました。

+0

フィルタ結果はどこから来ていますか?どのように見えますか? – StriplingWarrior

+0

filteredresultはfrom句とwhere句の結果です。私は、userIDとdatetimeによってfiltereingしているし、それらのレコードだけをカウントしています。 – frenchie

答えて

5

あなたが一緒にこれをハックすることができます

(from x in table 
where filter(x) 
group x by 0 into g 
select new { Count = (int?)g.Count() ?? 0, Sum = (int?)g.Sum(x => x.Value) ?? 0 }).Single() 

SQL Serverが不要なグループ化を最適化します。それはおそらくあなたがこれのように書いた理由を文書化するのが最善でしょう。

編集:私はintに変な見た目を含んでいますか?これは、LinqにSQLに値がNULL可能であると仮定し、NULLを0に変換するためにCOALELCE関数呼び出しを使用するように指示するためです。これは文書化する必要があるハックです。

+0

明確にする:このソリューションは、データベースへの1回のラウンドトリップを行います。 2つのクエリを実行するより効率的です。 – usr

+0

私はコンセプトが好きです。 where句でUserIDでフィルタリングしているので、グループ句「xをx.UserIDでグループ化する」という句を書き直しました。今私が抱えている問題は、グループが空であり、カウントがnullを返し、クエリがクラッシュすることです。どうすればいいですか?何もない場合、カウントを得るか0にするのですか? – frenchie

+0

私はこれについてあなたに警告するのを忘れました。私はいくつかのコードを追加しました。 – usr

1

あなたが本当に唯一つの結果を探しているので、これはおそらく最も簡単な方法です:

var filteredResults = from .... 
         where .... 
         select ....; 
var myModel = new MyModel{ Total = filteredResults.Count(), ... }; 
+0

ありがとう、私は、データベースからすべてのレコードを持ってきて、linqからオブジェクトへの集約を行うことで、これがどのように機能するかを見ています。私はまた、DBからすべての結果を戻すことなく、linq-to-SQLでそれを行う方法があるのだろうかと思っていました。 – frenchie

+1

@frenchie:あなたは実際にすべてをメモリに持ち込んでそこから数えているわけではありませんが、それは怠け者です。 –

+1

ここに怠惰に読み込まれているものは表示されません。もしそれが悪ければ、それはSELECT N + 1問題を引き起こすでしょう。 – usr