用LINQ返回一个独特的IQueryable?

我正在编写一个函数,它使用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函数,使其按照我打算的方式工作?

我发现用对象执行此操作的最简单方法是使用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对特定属性的Distinct()

如果将要返回的对象限制为仅显示要显示的字段,则它将正常工作。

 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; } 

尝试为正在选择的对象类型编写IEqualityComparer ,并在Distinct方法中使用它

围绕对象中各个字段的名称做出一些假设:

 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模式,您可能希望将此查询提升到模型中并返回包含这些字段的特定类。

使用Distinct()方法执行此操作。 例如:

 var query = from Notification in db.Notifications select Notification.client ; query=query.Distinct(); 

生成的查询将仅包含不同的值。

问题是你正在拉回会使每一行不同的字段。 就像sgriffinusa所说的那样,只能拉回你正在显示的3个值。

您可能希望为Distinct方法实现自定义比较器。 请在此处参考之前的SO问题。