我正在构建一个音乐投票应用程序,几乎与堆栈溢出类似。
我有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
答案 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()
};