我正在编写一个函数,它使用LINQ从DataBase中获取记录以获得IQueryable。此LINQ语句将在特定时间段内为活动用户提取所有记录,然后将UserID,First Name和Last Name吐出到Telerik RadGrid。
我的问题在于在拉动此数据时尝试在UserID上获得不同的值。我尝试重新编写此代码以获取结果。以下是拉动所有数据的代码示例,其中Distinct NOT工作。
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c).Distinct();
return Employees;
}
将DataSource应用到我的网格后,这将返回用户4次,该句点的每个记录一个实例。
有没有办法将Distinct应用于我的LINQ函数,使其按照我打算的方式工作?
答案 0 :(得分:24)
我发现用对象执行此操作的最简单方法是使用groupby然后选择第一个。
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c).GroupBy(g=>g.DataSystem_Employees.AccID).Select(x=>x.FirstOrDefault());
return Employees;
}
这没有经过测试,但一般的概念就在那里。
编辑:我记得最初在这里找到了答案。看看这个用于按特定属性对对象进行分组。 LINQ's Distinct() on a particular property
答案 1 :(得分:6)
如果将要返回的对象限制为仅显示要显示的字段,则它将正常工作。
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c.DataSystem_Employees.FName,
c.DataSystem_Employees.LName,
c.ID).Distinct();
return Employees;
}
答案 2 :(得分:4)
尝试为所选对象类型编写IEqualityComparer<T>
并在Distinct
方法中使用
答案 3 :(得分:2)
围绕对象中各个字段的名称做出一些假设:
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select new { FirstName = c.DataSystem_Employees.FName, LastName = c.DataSystem_Employees.LName, ID = c.DataSystem_Employees.ID }).Distinct();
return Employees;
}
要遵循MVC模式,您可能希望将此查询提升到模型中并返回包含这些字段的特定类。
答案 4 :(得分:0)
使用Distinct()方法执行此操作。 例如:
var query = from Notification in db.Notifications
select Notification.client ;
query=query.Distinct();
生成的查询只包含不同的值。
答案 5 :(得分:-1)
问题是你要拉回会使每一行不同的字段。就像sgriffinusa所说的那样,只会拉回你正在显示的3个值。
答案 6 :(得分:-1)
您可能希望为Distinct方法实现自定义比较器。请参阅之前的SO问题here。