2010-12-17 112 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(); 

生成的查詢將只包含不同的值。