我正在尝试使用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 });
}
感谢您提供进一步的帮助。
答案 0 :(得分:1)
你需要这样的东西吗? http://www.codeproject.com/Articles/535374/DistinctBy-in-Linq-Find-Distinct-object-by-Propert
答案 1 :(得分:0)
如果database_B
是class
(而非struct
)而未以合适的方式实施IEquatable<database_B>
,Distinct
会处理不同的对象不同的成员价值观。一种可能的解决方案是实施IEquatable<database_B>
以反映平等所需的比较。
或者,可以使用Distinct
的不同重载,可以将自定义比较作为参数。
答案 2 :(得分:0)
您的班级database_B
必须实施Equals-和GetHashCode-Method,以告诉Distinct
在哪种情况下两个实例被视为相等,并可能因此被过滤掉。