将SQL查询转换为LINQ(子查询)

时间:2012-10-26 18:06:17

标签: c# asp.net-mvc linq entity-framework

您有一个网站,用户可以在图像上投票。 投票存储在表格投票中,我存储提交的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();

谢谢。

3 个答案:

答案 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)

对我而言似乎是一个相当直接的端口,除了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上进行分组,而不是作为内部查询,它应该更有效率,但这完全取决于你。

答案 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();