0

ほぼスタックオーバーフローに似た、音楽投票アプリケーションを構築しています。

Charts、ChartItems、Votesの3つのテーブルがあります。

各チャート項目の投票数をカウントして、単一のチャートにリンクするチャート項目のリストを戻そうとしています。

これは私が現在試していることです

var firstList = from chartItem in db.ChartItems
                        join vote in db.Votes on chartItem.ixChartId equals vote.ixChartId into j1
                        where chartItem.ixChartId == id                            
                        from j2 in j1.DefaultIfEmpty()
                        group j2 by chartItem.ixChartItemId into grouped                   
                        select new ChartItemWithVotes
                        {                             
                          totalVotes =  grouped.Count(t => t.ixVoteId != null),

                        //CANT GET OTHER PROPS HERE

                        };

問題は、グループ化を実行すると、結合からモデルに入力するために必要な他のプロパティを取得できないことです。たとえば、各 ChartItem にはタイトル、ID などを含める必要があります。

ChartItemWithVotes (すべてのエンティティ値 + int totalVotes を含む) と呼ばれる、必要なすべてのプロパティを保持する ViewModel を作成しました。

誰でも私が間違っているところを手伝ってもらえますか?

結局これを求めて

チャート名

投票名

20 - チャート項目名

15 - チャート項目名

12 - ChartITemName

4

3 に答える 3

1

これはあなたが探している答えではないかもしれませんが、SQLサーバーで適切な関係が設定されているため、DBMLにインポートされている場合は、次のことができるはずです。

var chartvotes = from chartItem in db.ChartItems
    select new {
    ChartItem = chartItem,
    TotalVotes = chartItem.Votes.Count()
};
于 2010-10-11T14:30:12.500 に答える
0

chartItemId と総投票数が得られるクエリを作成し、それに基づいて db.ChartItems からすべてのグラフ項目を選択することをお勧めします。そうしないと、すぐに読めなくなる可能性があります。そのようにすることでパフォーマンスが低下することもありません。linq での遅延実行により、データベースが 1 回のヒットしか受けないことを確認する必要があります。

代わりに ChartItem テーブルを指しているはずなのに、Votes テーブルに Chart テーブルの外部キーがあるという点で、設計に欠陥があるようです。そうすれば、私の提案はさらに理にかなっていて、通常のGroupBy句ですべてを解決できるでしょう。

のようになるはずですChart -> ChartItem -> Votes

あなたの現在のデザインはもっと似ているようですChartItem <- Chart -> Votes

このアプローチはどうですか:

var result = db.Votes
   .Where(v => v.chartItemId != null)
   .GroupBy(v => v.chartItemId)
   .Join(db.ChartItems, v => v.Key, c => c.chartItemId, (v, c) => new {Votes = v.Count(), c.Title, c.Id});
于 2010-10-11T13:46:35.663 に答える
0

ネストされたlinqクエリを実行すると、うまく機能します。アプリケーションで使用しています。メインクエリで投票テーブルに直接関連するwhere句を使用していないため、問題なく動作するはずです。

var firstList = from chartItem in db.ChartItems
                where chartItem.ixChartId == id                            
                select new ChartItemWithVotes
                {
                    chartItemName = chartItem.asName,
                    totalVotes =  (from votes in db.Votes
                                  where vote.ixChart == chartItem.ixChart
                                  select vote.ixVoteId).Count()
                };
于 2010-10-12T18:52:49.970 に答える