0

我正在构建一个音乐投票应用程序,几乎类似于堆栈溢出。

我有 3 个表格,图表,ChartItems,投票。

我正在尝试恢复图表项目列表,该列表链接到单个图表,并计算每个图表项目的票数。

这就是我目前正在尝试的

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 等...

我创建了一个 ViewModel 来保存我需要的所有属性,称为 ChartItemWithVotes(包括所有实体值 + int totalVotes)

谁能帮我解决我哪里出错了。

最后我正在寻找这个

图表名称

投票名称

20 - 图表项目名称

15 - 图表项目名称

12 - 图表项目名称

4

3 回答 3

1

这可能不是您要寻找的答案,但如果在 SQL Server 中设置了适当的关系,因此已导入 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 中的延迟执行应该确保 db 只需要一次命中。

您的设计似乎存在缺陷,因为您的 Votes 表具有 Chart 表的外键,而它应该指向 ChartItem 表。然后我的建议会更有意义,您将能够使用常规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 回答