2013-05-07 49 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

相关问题