2012-10-26 59 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();