LINQ返回DISTINCT值

问题描述:

我有一个LINQ to Entities查询,我只想返回TagID和TagName的唯一值。LINQ返回DISTINCT值

代码:

var tags = (from t in _dbContext.TaskRecordDetails.ToList() 
         join tag in _dbContext.Tags on t.TagName equals tag.TagName 
         where t.Period == period 
         select new TagDTO() 
         { 
          TagID = tag.TagID, 
          TagName = tag.TagName 
         }); 

      return tags.Distinct<TagDTO>(); 

但是,重复行仍返回如下。我如何确保只返回唯一的行?

[ 
    { 
     "TagID": 1, 
     "TagName": "Level 1", 
     "TagDescription": null, 
     "IsActive": false 
    }, 
    { 
     "TagID": 2, 
     "TagName": "Level 3", 
     "TagDescription": null, 
     "IsActive": false 
    }, 
    { 
     "TagID": 3, 
     "TagName": "Level 5", 
     "TagDescription": null, 
     "IsActive": false 
    }, 
    { 
     "TagID": 1, 
     "TagName": "Level 1", 
     "TagDescription": null, 
     "IsActive": false 
    }, 
    { 
     "TagID": 2, 
     "TagName": "Level 3", 
     "TagDescription": null, 
     "IsActive": false 
    } 
] 
+4

向我们展示你的'TagDTO'类,特别是其'GetHashCode'实施。 – mjwills

+0

[linq&distinct,实现equals和gethashcode]的可能重复(https://*.com/questions/4786919/linq-distinct-implementing-the-equals-gethashcode) – mjwills

+4

为什么你要做'.ToList( )'TaskRecordDetails'上?尝试删除,查询应该被转换为SQL和Distinct应该工作。 – Magnus

根据您最后的评论,这里是一个解决方案:

var tags = (from t in _dbContext.TaskRecordDetails 
      join tag in _dbContext.Tags on t.TagName equals tag.TagName 
      where t.Period == period 
      select tag).Distinct().ToList(); 

return tags.select(x => new TagDTO 
{ 
    TagID = x.TagID, 
    TagName = x.TagName 
}); 
+0

谢谢!为什么这个工作,而不是我的代码?两者非常相似。 – Kevin

+1

它返回一个已知实体对象(PO​​CO)。您遇到的错误是'实体或复杂类型'TagDTO'无法在LINQ to Entities查询中构造“,并且与返回非POCO对象有关。 –