2013-05-07 26 views
1

我有一個非常基本的sql視圖,它加入了3個表格:用戶,圖片和標籤。在使用自定義類時選擇GroupBy中的第一項

如何創建下面的查詢,以便它不會多次列出相同的圖片?換句話說,我想分組照片(我認爲),並返回每個圖像的第一次檢查。

我認爲這與帖子Linq Query Group By and Selecting First Items非常相似,但我無法弄清楚在查詢實例化MyImageClass的情況下如何應用它。

 validPicSummaries = (from x in db.PicsTagsUsers 
     where x.enabled == 1 
      select new MyImageClass { 
       PicName = x.picname, 
       Username= x.Username, 
       Tag = x.tag }).Take(50); 

回答

3

要排除重複的,你可以使用Distinct LINQ方法:

validPicSummaries = 
    (from x in db.PicsTagsUsers 
    where x.tag == searchterm && x.enabled == 1 
    select new MyImageClass 
    { 
     PicName = x.picname, 
     Username= x.Username, 
     Tag = x.tag 
    }) 
    .Distinct() 
    .Take(50); 

您需要確保的對象是可比性,使具有相同PicNameUsername兩個MyImageClass對象,和Tag被認爲是相等的(或者你希望認爲其中兩個是相等的)。

如果您想爲這種情況設置自定義比較器,您可以編寫一個實現IEqualityComparer<T>的小類。例如:

private class MyImageClassComparer : IEqualityComparer<MyImageClass> 
    { 
    public bool Equals(MyImageClass pMyImage1, MyImageClass pMyImage2) 
    { 
     // some test of the two objects to determine 
     // whether they should be considered equal 

     return pMyImage1.PicName == pMyImage2.PicName 
      && pMyImage1.Username == pMyImage2.Username 
      && pMyImage1.Tag == pMyImage2.Tag; 
    } 

    public int GetHashCode(MyImageClass pMyImageClass) 
    { 
     // the GetHashCode function seems to be what is used by LINQ 
     // to determine equality. from examples, it seems the way 
     // to combine hashcodes is to XOR them: 

     return pMyImageClass.PicName.GetHashCode() 
     ^pMyImageClass.UserName.GetHashCode() 
     ^pMyImageClass.Tag.GetHashCode(); 
    } 
    } 

然後當你調用不同:

... 
    .Distinct(new MyImageClassComparer()) 
    .Take(50); 
+0

難道我需要排除標籤,這樣我剛剛得到的PIC的第一個實例,如果它有很多的標籤?看起來不錯,就像我忽略了這個明顯的解決方案。我會馬上回來...... – Dave 2013-05-07 00:44:35

+0

@Dave我不確定這些屬性的含義。這取決於你如何認爲它們是重複的。 – 2013-05-07 00:48:09

+0

優秀。謝謝。 – Dave 2013-05-07 01:18:34

相關問題