C# Linq2sql计数分组投票实体查询问题,分组后无法获取属性?

C# Linq2sql计数分组投票实体查询问题,分组后无法获取属性?,c#,asp.net,asp.net-mvc,linq-to-sql,vote,C#,Asp.net,Asp.net Mvc,Linq To Sql,Vote,我正在构建一个音乐投票应用程序,类似于stack overflow 我有3张表格,图表,图表项目,投票 我试图带回一个图表项目列表,它链接到一个图表,每个图表项目的投票数都已计算在内 这就是我目前正在尝试的 var firstList = from chartItem in db.ChartItems join vote in db.Votes on chartItem.ixChartId equals vote.ixChartId into j1

我正在构建一个音乐投票应用程序,类似于stack overflow

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

                        };
问题是,一旦执行了分组,就无法从连接中获得填充模型所需的任何其他属性。例如,每个图表项都应该有标题、id等

我已经创建了一个ViewModel来保存我需要的所有属性,名为ChartItemWithVotesincludes all entity Value+int totalVotes

谁能帮我找出哪里出了问题

最后,我在寻找这个

图表名称

投票人姓名

20-ChartItemname

15-ChartItemname


12-ChartITemName

我认为您可能需要创建一个查询,生成chartItemId和总投票数,并根据该查询从db.ChartItems中选择所有图表项。否则它可能很快就不可读了。这样做也不会影响性能。linq中的延迟执行应该确保db只接受一次命中

您的设计似乎有缺陷,因为您的投票表有一个Chart table外键,而它应该指向ChartItem表。那么我的建议就更有意义了,你可以用一个常规的GroupBy子句来解决所有问题

它应该类似于图表->图表项->投票

看起来您当前的设计更像是ChartItem投票

这种方法怎么样:

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});

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

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

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

但是如果我选择了所有的图表项目,我会不会失去我刚刚统计的选票?如何组合两个查询的结果?如果您的表关系正确,单次查询就足够了。我的投票具有chart和chartitem外键,因为我希望能够对图表和图表项进行投票?我投票总是有一个chartId,如果它没有chartItem id,那么我知道这是对图表本身的投票。我认为它应该编译并运行正常,但我还没有triedOk,是的,它正在工作。与手工编写sql相比,使用它是否存在任何性能问题?LINQtoSQL旨在生成最佳sql,因此您不应该受到任何性能影响。