2010-12-17 60 views
12

我在写一个函数,它使用LINQ从DataBase中获取记录来获取IQueryable。此LINQ语句将在特定时间段内为活动用户提取所有记录,然后将用户ID,名字和姓氏吐出到Telerik RadGrid中。用LINQ返回一个独特的IQueryable?

我的问题在于试图在拉取此数据时获取用户标识的不同值。我试着重新编写这段代码来获得我的结果。以下是拉取所有数据的代码示例,其中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; 
} 

将数据源应用到我的网格后,此操作返回用户4次,每个记录对应一个实例。

alt text

是否有适用清晰到我的LINQ功能,使这项工作我就打算的方式呢?

回答

20

最简单的方法,我发现这样做与对象是使用该组,然后选择第一个。

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

GroupBy工作完美!我最初在故障排除时尝试过GroupBy,但是我错过了.Select(x => x.FirstOrDefault())。谢谢! – Lando 2010-12-17 17:22:21

+0

按顺序应该在选择组之后在第一个缺席之前。假设你关心登录时间。 – 2017-01-22 12:27:00

4

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

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

理论上这应该起作用,但IntelliSense在尝试向Statement添加多个Entity时拒绝了我。 – Lando 2010-12-17 17:25:00

+0

你有什么错误? – sgriffinusa 2010-12-17 20:40:08

+0

@sgriffinusa,你需要'select new {}'...因为它是你的语法是无效的 – 2017-01-22 12:28:57

4

尝试写对象类型的IEqualityComparer<T>被选中,并在您Distinct方法

+2

这将使用linq来对象而不是合成查询 – 2017-01-22 12:29:50

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

-1

问题是你拉回的领域,将使每一行不同。就像sgriffinusa所说的那样,只需拉回你正在显示的3个数值即可。

-1

您可能想要为Distinct方法实现自定义比较器。请参阅以前的SO问题here

0

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

var query = from Notification in db.Notifications 

         select Notification.client ; 
      query=query.Distinct(); 

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

相关问题