2017-08-29 82 views
0

我有一個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://stackoverflow.com/questions/4786919/linq-distinct-implementing-the-equals-gethashcode) – mjwills

+4

爲什麼你要做'.ToList( )'TaskRecordDetails'上?嘗試刪除,查詢應該被轉換爲SQL和Distinct應該工作。 – Magnus

回答

1

根據您最後的評論,這裏是一個解決方案:

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對象有關。 –