2014-04-01 58 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/