您有一个网站,用户可以在图像上投票。 投票存储在表格投票中,我存储提交的ID(FK_id)
表格是:
表格提交
Id(uniqueidentifier)
名称(varchar(50))
图像(varchar(50))
表格投票
Id(int)
Fk_id(Submissions.Id的外键)
我是linq的新手,所以我不知道如何翻译它:
SELECT *,
isnull((SELECT count(*)
FROM Votes
WHERE Fk_id = S.Id
GROUP BY Fk_id),0) as Votes
FROM Submissions S
我想要这样的东西:
List<Model> = (from p in ????
select new Model
{
Name = p.Name,
Image = p.Image,
Votes = p.Votes
}).ToList();
谢谢。
答案 0 :(得分:3)
不是翻译你的Sql(我认为它过于复杂),你不想只做以下的事情:
List<Model> = (from p in Submissions
select new Model
{
Name = p.Name,
Image = p.Image,
Votes = p.Votes.Count()
}).ToList();
答案 1 :(得分:1)
对我而言似乎是一个相当直接的端口,除了select
和from
的顺序被颠倒。
Submissions.Select(sub => new
{
//...other fields
Votes = Votes.Where(vote => vote.Fk_id == sub.Id)
.GroupBy(vote => vote.Fk_id)
.Select(group => group.Count()),
}
现在,查看查询你可能只是直接在Votes上进行分组,而不是作为内部查询,它应该更有效率,但这完全取决于你。
答案 2 :(得分:1)
这将是您的SQL
代码的翻译,该代码还考虑了isnull
,确保每次提交都有模型:
List<Model> list = (from s in Submissions
select new Model
{
Id = s.Id,
Name = s.Name,
Image = s.Image,
Votes = (from v in Votes
where v.Fk_id == s.Id
group v by v.Fk_id into g
select g.Count()).FirstOrDefault()
}).ToList();
如果您使用Entity Framework
,则应确保正确生成数据模型。
在这种情况下,您的Submission
实体已经包含Votes
作为属性。然后一切都很简单:
List<Model> list = (from s in context.Submissions
select new Model
{
Id = s.Id,
Name = s.Name,
Image = s.Image,
Votes = s.Votes.Count()
}).ToList();