2014-04-01 126 views
2

我有一個View在LNameByFName中檢索2個或更多相同的數據,顯示相同的名稱。無論索引如何,我如何只顯示一個這些名稱?在LINQ中過濾冗餘數據

我可以使用FirstOrDefault(),但我已經有.ToList()

public IEnumerable<EmployeeWithEmail> GetAllEmployeesWithEmail(int x) 
{ 
     using (var context = new SQL_TA_SCOREBOARDEntities1()) 
     { 
     return (from ea in context.View_1 
       join vh in context.View_2 on (Int16)ea.EmpNo equals vh.EmpNo 
       join rl in context.View_3 on ea.RoleID equals rl.id into outer_join 
       from subjoin in outer_join where ea.GroupID == x 
       select new EmployeeWithEmail 
       { 

        EmpNum = ea.EmpNo ?? 0, 
        Role = subjoin.Role, 
        EmailAddress = vh.EmailAddress, 
        LNameByFname = vh.LNameByFName, 
        Active2 = ea.Active ?? false 

       }).ToList(); 

    } 
} 

回答

3

如果你想保持「集團」內聯,使用現有的查詢語法,試試這個:

return (from ea in context.View_1 
     join vh in context.View_2 on (Int16)ea.EmpNo equals vh.EmpNo 
     join rl in context.View_3 on ea.RoleID equals rl.id into outer_join 
      from subjoin in outer_join where ea.GroupID == x 
     group new 
     { 
      ea.EmpNo, 
      subjoin.Role, 
      vh.EmailAddress, 
      vh.LNameByFName, 
      ea.Active 
     } by vh.LNameByFName into grp 
     let item = grp.FirstOrDefault() 
     select new EmployeeWithEmail 
     { 
      EmpNum = item.EmpNo ?? 0, 
      Role = item.Role, 
      EmailAddress = item.EmailAddress, 
      LNameByFname = item.LNameByFName, 
      Active2 = item.Active ?? false 
     }).ToList(); 

僅供參考,當您使用FirstOrDefault(),你通常要測試null過,像EmpNum = (item != null ? item.EmpNo ?? 0 : -1), 。否則,您可能會收到NullReferenceException

但我認爲你的安全在這種情況下......我不明白「一個組」如何不會有至少一個項目在其中。

+0

Aw。 'get'無法將lambda表達式轉換爲類型'System.Collections.Generic.IEqualityComparer ',因爲它不是'group new'和'rl'中的「group」的委託類型:在當前上下文中不存在。 – user3483341

+0

哎呀。那好吧。我沒有辦法測試這個,並想知道它是否會正確翻譯。可能不會! –

+0

沒問題。感謝您的迴應! – user3483341

-1

select後,你的電話.ToList()通過.Distinct()IEqualityComparer之前。

+0

對不起,你可以修改代碼嗎?我對LINQ很陌生,不知道IEQualityComparer是什麼。 LNameByFname = vh.LNameByFName.Distinct()? – user3483341

+1

不確定您可以將EqualityComparer傳遞給Linq-to-SQL。 – Aron

+0

@ user3483341'IEqualityComparer'是一個接口,您想要實現它,那麼您可以將您的實現傳遞給進行比較的各種方法。文檔可以在這裏找到; http://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx – evanmcdonnal

1

消除重複,使用的GroupBy隨後採取:

IQueryable<EmployeeWithEmail> query = ...; 
    // group by the value you want to be unique 
    var queryWithoutDuplicates = query.GroupBy(e => e.LNameByFName) 
     // then select the first (arbitrary since there's no order) member of each group 
     .SelectMany(g => g.Take(1)) 
     .ToList(); 

如果您已經被拉結果存入內存中,您還可以使用distinct),其採用的IEqualityComparer過載(:

// AsEnumerable() pulls us into memory, where we can use EqualityComparers 
var queryWithoutDuplicates = query.AsEnumerable() 
    // do a distinct using a comparer based on the key you want to be unique 
    .Distinct(EqualityComparers.Create((EmployeeWithEmail e) => e.LNameByFName)) 
    .ToList(); 

EqualityComparers.Create定義在:http://www.codeducky.org/10-utilities-c-developers-should-know-part-two/