Linq2sql计数分组投票实体查询问题,一旦分组就无法获取属性?

时间:2010-10-11 13:26:55

标签: c# asp.net asp.net-mvc linq-to-sql vote

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

我有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 - ChartItemname

15 - ChartItemname

12 - ChartITemName

3 个答案:

答案 0 :(得分:1)

这可能不是您正在寻找的答案,但如果在SQL Server中设置了适当的关系,并因此已导入到DBML中,您应该能够执行以下操作:

var chartvotes = from chartItem in db.ChartItems
    select new {
    ChartItem = chartItem,
    TotalVotes = chartItem.Votes.Count()
};

答案 1 :(得分: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});

答案 2 :(得分: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()
                };