我有一个非常基本的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
, Username
和Tag
的两个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);