2017-08-29 11 views
0

私は、TagIDとTagNameの一意の値だけを返すLINQ to Entitiesクエリを使用しています。LINQ Return 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、duplicate of equalals&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

既知のエンティティオブジェクト(POCO)を返します。あなたが持っていたエラーは、 'エンティティまたは複合型' TagDTO 'はLINQ to Entitiesクエリで構築できず、非POCOオブジェクトを返すことに関連しています。 –