1

嗨,有一个用户可以对图像进行投票的网站。投票存储在表 Votes 中,我存储提交的 Id (FK_id)


这些表是:

表格提交
ID (uniqueidentifier)
名称 (varchar(50))
图片 (varchar(50))

Table Votes
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();

谢谢你。

4

3 回答 3

3

而不是翻译你的Sql(我认为这太复杂了),你不想做类似的事情:

List<Model> = (from p in Submissions 
              select new Model
              {
                 Name = p.Name,
                 Image = p.Image,
                 Votes = p.Votes.Count() 
              }).ToList();
于 2012-10-26T18:41:56.077 回答
1

对我来说,这似乎是一个相当直接的端口,除了顺序selectfrom被颠倒。

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 上进行分组,而不是作为内部查询,它应该更有效率,但这完全取决于您。

于 2012-10-26T18:15:41.570 回答
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();
于 2012-10-26T18:36:22.643 回答