【问题标题】:Linq2sql count grouping vote entity query problems, can't get properties once grouped?linq2sql计数分组投票实体查询问题,分组后无法获取属性?
【发布时间】:2010-10-11 13:26:54
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,是的,这是有效的。使用 this 与手动编写 sql 有什么性能问题吗?
    • Linq-to-SQL 旨在生成最佳 SQL,因此不会对性能造成任何影响。
    【解决方案2】:

    嵌套的 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()
                    };
    

    【讨论】:

      【解决方案3】:

      我认为您可能希望创建一个查询,从而产生 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});
      

      【讨论】:

      • 但是如果我然后选择所有图表项,我不会失去我刚刚计算的选票吗?如何组合两个查询的结果?
      • 如果你的表关系正确,一个查询就足够了
      • 我的投票有chart和chartitem的外键,因为我希望能够在chart和chart item上投票?我投票总是有一个chartId,如果它没有chartItem id,那么我知道这是对图表本身的投票。
      • 好的,我试图在编辑后的答案中举一个例子。我认为它应该可以编译并运行,但我没有尝试过
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      相关资源
      最近更新 更多