在使用自定义类时选择GroupBy中的第一项



我有一个非常基本的sql视图,它连接3个表:用户,图片和标签。

如何创建下面的查询,使其不会多次列出相同的图片?换句话说,我想按图片分组(我认为),并返回每个图片的第一个实例。

我认为这是非常类似于后Linq查询组和选择第一项,但我不知道如何应用它在这种情况下,查询是实例化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);

要排除重复项,可以使用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);

您需要确保对象具有可比性,以便具有相同PicName, UsernameTag的两个MyImageClass对象被认为是相等的(或者您希望将它们中的两个视为相等)。

你可以写一个实现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:

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

最新更新