2012-10-26 25 views
1

您好有一个网站,用户可以在图像上投票。 的票都存储在我店提交的ID表票数(FK_id)将SQL查询转换为LINQ(子查询)


的表是:

表提交
ID(唯一标识符)
名称(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

而不是翻译你的SQL(我认为这是过于复杂),你不只是想要做的事,如:

List<Model> = (from p in Submissions 
       select new Model 
       { 
       Name = p.Name, 
       Image = p.Image, 
       Votes = p.Votes.Count() 
       }).ToList(); 
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()), 
} 

,看着查询你很可能只是做组通过投票直接,而不是作为一个内部查询,它应该是相当多的效率,但是这完全取决于你。

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