之前我根据每个对象中的特定属性,在question on Stackoverflow中添加了如何删除对象列表中的重复记录。
我得到了我正在寻找的答案(见下文),查询返回一个不同的列表对象,使用MainHeadingID作为删除重复项的属性。
public IList<tblcours> GetAllCoursesByOrgID(int id)
{
return _UoW.tblcoursRepo.All.
Where(c => c.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id))
.GroupBy(c => c.MainHeadingID)
.Select(g => g.FirstOrDefault())
.ToList();
}
然而,现在我需要更多的帮助!无论如何修改上面的查询,以便仅在MainHeadingID不等于180 时删除重复值。我尝试修改GroupBy行
.GroupBy(c => c.MainHeadingID != 180)
但是,这不起作用。
任何帮助都会非常感激。
感谢。
答案 0 :(得分:2)
以下适用于LINQ to SQL:
return _UoW.tblcoursRepo.All
.Where(c => c.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id))
.GroupBy(c => c.MainHeadingID)
//.SelectMany(g => g.Key == 180 ? g : g.Take(1))
.SelectMany(g => g.Take(g.Key == 180 ? Int32.MaxValue : 1))
.ToList();
上面查询中的 评论: SelectMany
选择MainHeadingID
等于180的组中的所有项目,但只有一个项目形成其他组(即不同的结果)。 Linq to SQL无法翻译注释掉的部分,但多亏了@usr,有办法解决。
Linq to Entities甚至无法翻译简化查询。我认为在这种情况下,只有两个查询的简单结论是
Expression<Func<tblcours, bool>> predicate = x =>
x.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id)
int headingId = 180;
return _UoW.tblcoursRepo.All
.Where(c => c.MainHeadingID != headingId)
.Where(predicate)
.GroupBy(c => c.MainHeadingID)
.Select(g => g.FirstOrDefault())
.Concat(_UoW.tblcoursRepo.All
.Where(c => c.MainHeadingID == headingId)
.Where(predicate))
.ToList();
答案 1 :(得分:2)
.SelectMany(g => g.Key == 180 ? g.Take(int.MaxValue) : g.Take(1))
或
.SelectMany(g => g.Take(g.Key == 180 ? int.MaxValue : 1))
请注意,由于将其转换为SQL,性能不会特别好。