Distinct()linq查询

时间:2015-05-18 11:17:21

标签: c# linq entity-framework

我正在尝试使用distinct()方法过滤我的linq查询,但我不断获取所有数据记录(包括重复)。我尝试了以下变化,这些变化似乎都失败了。

           int total = Data.Count();

           // Data = Data.GroupBy(member => member.Tag).Select(x => x.OrderBy(y => y.Name).First());

           // Data = Data.OrderByDescending(c => c.UploadDate);

            Data = Data.Distinct().OrderBy(value => value.Tag);

            var data = Data.ToList();

如何通过显示按唯一tags字段名称过滤的所有数据字段名来过滤我的查询?我的tag字段名也包含NULL个数据。

以下是我的整个方法,供进一步参考:

        [Authorize]
    [HttpPost]
   private HttpResponseMessage method(HttpContext request, Query query)
    {
        if (User.IsInRole("admin") || User.IsInRole("art"))
        {
            IQueryable<database_B> Data = null;

            if (!string.IsNullOrEmpty(query.name))
            {
                var ids = query.name.Split(',');

               // var dataMatchingTags = db.database_B.Where(c => ids.Any(id => c.Name.Contains(id)));

                if (Data == null)
                    Data = dataMatchingTags;
                else
                    Data = Data.Union(dataMatchingTags);
            }

            if (Data == null) // If no tags or name is being queried, apply filters to the whole set of products
                Data = db.database_B;

            if (query.endDate != null)
            {
                Data = Data.Where(c => c.UploadDate <= query.endDate);
            }

            if (query.startDate != null)
            {
                Data = Data.Where(c => c.UploadDate >= query.startDate);
            }

            int total = Data.Count();

           // Data = Data.GroupBy(member => member.Tag).Select(x => x.OrderBy(y => y.Name).First());

           // Data = Data.OrderByDescending(c => c.UploadDate);

            Data = Data.Distinct().OrderBy(value => value.Tag);

            var data = Data.ToList();

            if (!data.Any())
            {
                var message = string.Format("No data found");
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
            }

           // return Request.CreateResponse(HttpStatusCode.OK, data);
            return Request.CreateResponse(HttpStatusCode.OK, new { total, data });
        }

感谢您提供进一步的帮助。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

如果database_Bclass(而非struct)而未以合适的方式实施IEquatable<database_B>Distinct会处理不同的对象不同的成员价值观。一种可能的解决方案是实施IEquatable<database_B>以反映平等所需的比较。

或者,可以使用Distinct的不同重载,可以将自定义比较作为参数。

答案 2 :(得分:0)

您的班级database_B必须实施Equals-和GetHashCode-Method,以告诉Distinct在哪种情况下两个实例被视为相等,并可能因此被过滤掉。

相关问题