Linq To Entities可选区别

时间:2013-02-26 13:52:31

标签: linq entity-framework linq-to-entities distinct

之前我根据每个对象中的特定属性,在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)

但是,这不起作用。

任何帮助都会非常感激。

感谢。

2 个答案:

答案 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)

lazyberezovsky的回答由于EF错误而失败(考虑到EF的LINQ支持的质量,这并不奇怪)。它可以与黑客一起工作:

.SelectMany(g => g.Key == 180 ? g.Take(int.MaxValue) : g.Take(1))

.SelectMany(g => g.Take(g.Key == 180 ? int.MaxValue : 1))

请注意,由于将其转换为SQL,性能不会特别好。