2016-11-02 223 views
0

SELECT DISTINCT的问题asked here的扩展,我试图做同样的功能,即与LINQ到实体

IEnumerable<Customer> filteredList = originalList 
    .GroupBy(customer => customer.CustomerId) 
    .Select(group => group.First()); 

这在评论,有人暗示,如果是的LINQ这是不行的实体,当然不是为我工作,我得到一个空结果集。

不适合我!即使我尝试了'FirstOrDefault',但它不起作用。 - JatSing Sep 25 11年在13:55

@JatSing:您必须使用Linq到实体。 - 乔希Mouch年02月14 '12 14:45

所以,如果上面没有对LINQ工作实体,我将如何去分组由两列设置的EntityType消息的IEnumerable,然后得到每组的第一行?

+0

“空结果集”,你的意思是filteredList是一个没有值的IEnumerable,或者你说'filteredList'实际上是'null'吗?如果是前者,你确定'originalList'有任何内容吗? – UtopiaLtd

+0

IEnumerable没有值,originalList具有期望的内容 – ItinerantEngineer

+1

可能不理想,但如果在'.GroupBy(...)'之前调用'.ToList()'会怎么样? – UtopiaLtd

回答

0

如果您在通过实体框架等方式评估LINQ表达式时遇到问题,您可以致电.ToList()强制将查询实现到内存中以供进一步处理。如果来自数据库或其他来源的结果的获取非常昂贵并且可以首先进一步缩小,则这并不理想。

IEnumerable<Customer> filteredList = originalList 
    .ToList() 
    .GroupBy(customer => customer.CustomerId) 
    .Select(group => group.First()); 

.ToList()调用使得实体框架加载与数据库的完整originalList(我以为是某种形式的IQueryable<T>),允许.GroupBy(...)在内存中进行评估关闭的originalList全部结果的,而不是部分EF构建的SQL查询。

+0

“.OrderOrDefault()”的人来说,上述评论中提到的是一种更好的方法,如果你先调用'.ToList()',那么'.First()'是合适的,因为在这一点上你不会有任何小于1的有效分组。 – UtopiaLtd

+0

一旦你要使用LINQ to Objects进行分组,最好使用'AsEnumerable'来切换上下文而不是'ToList'。 –