使用LINQ返回一个独特的IQueryable?

时间:2010-12-17 16:07:17

标签: c# linq distinct

我正在编写一个函数,它使用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次,该句点的每个记录一个实例。

alt text

有没有办法将Distinct应用于我的LINQ函数,使其按照我打算的方式工作?

7 个答案:

答案 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