如何使用Linq或EF来对数据去重——Distinct方法详解
刚开始接触LINQ时使用distinct去重时和大家一样遇到了一些麻烦,很感谢 http://www.cnblogs.com/A_ming/archive/2013/05/24/3097062.html 提供的一些方法。
后来经过深入学习,了解了一些更为简洁的方法,在这里与大家一同分享。
如上图在WebConfig表中含有以下三个字段Name,Linkhref和Type,现在我们要对Type去重获取所有类型。
第一种使用Distinct方法:
ViewBag.Dist = db.WebConfig.Select(p => p.Type).Distinct().ToList();
使用这种方法筛选出来的是一个string集合
前台展示:
<ul> @foreach (string dist in ViewBag.Dist) { <li>@dist</li> } </ul>
第二种使用DistinctBy方法:
ViewBag.Dist1 = db.WebConfig.DistinctBy(p => p.Type).ToList();
使用这种方法筛选出来的是一个Model类型(WebConfig)
前台展示:
<ul> @foreach (WebConfig dist1 in ViewBag.Dist1) { <li>@dist1.Type</li> } </ul>
第三种使用GroupBy方法:
ViewBag.Dist2 = db.WebConfig.GroupBy(p => p.Type).Select(p=>p.Key).ToList();
使用这种方法筛选出来的是一个键值对(<string,WebConfig>)
前台展示:
<ul> @foreach (string dist2 in ViewBag.Dist2) { <li>@dist2</li> } </ul>
todictionary:
var m = db.D_Annotation.Where(p => p.DocumentID == id).GroupBy(p => p.ProofreadType).Select(p => new { p.Key, CompletedCount = p.Sum(a => a.IsCompleted), TotalCount = p.Count() }) .ToDictionary(p => p.Key, p => new Dictionary<string, object> { {"CompletedCount", p.CompletedCount}, {"TotalCount", p.TotalCount} });