2

早些时候,我在 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)

然而,这并没有奏效。

任何帮助将不胜感激。

谢谢。

4

2 回答 2

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();

评论: 在上面的查询中,从等于 180SelectMany的组中选择所有项目,但它只从其他组中取一个项目(即不同的结果)。MainHeadingIDLinq 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();
于 2013-02-26T13:56:49.070 回答
2

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

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

或者

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

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

于 2013-02-26T14:16:46.150 回答