LINQ Group错误的结果

时间:2019-06-29 07:45:51

标签: c# sql linq

我的桌子

userid                                       UserApproveLevel_Two_T
1118bda4-6cba-43d6-a0cd-555555555555               True
22299872-aa01-498a-831d-555555555555               False
333a8ddb-d261-47d9-8ec8-555555555555               False

-

 var sky = DB.UserSkypeTrackers.GroupBy(x => x.UserApproveLevel_Two_T == true).FirstOrDefault();

-

 foreach (var item in sky )
  {
       // in here    i see  
       //22299872-aa01-498a-831d-555555555555
       //333a8ddb-d261-47d9-8ec8-555555555555        
  }

-

我应该看到

  

1118bda4-6cba-43d6-a0cd-555555555555

在我的foreach中

为什么我看到错误的结果?

谢谢

2 个答案:

答案 0 :(得分:0)

LINQ to Objects中的Enumerable.GroupBy方法保留了文档的分组顺序:

  

IGrouping<TKey,TElement>对象的产生顺序基于source中产生每个IGrouping<TKey,TElement>的第一个键的元素的顺序。分组中的元素按照它们在source中出现的顺序产生。

您期望看到的是111...

但是 ,您似乎在数据库表或类似表上使用GroupBy。这意味着您正在使用Queryable.GroupBy。根据 its 文档,

  

由于执行表示调用GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>)的表达式树而发生的查询行为取决于源参数类型的实现。预期的行为是,它通过对每个元素调用keySelector获得的键值对源元素进行分组。

如您所见,确切的行为是特定于实现的,并且不必保留顺序。因此,第一个IGrouping不一定是键为true的组。

因此,要获得您想要的结果,

  • 使用Where通过键true查找组,或者
  • 首先将所有对象加载到内存中,然后使用LINQ来访问对象的GroupBy。 (如果数据库中有很多对象,这可能会很慢)

答案 1 :(得分:0)

GroupBy()根据指定的根对列表中存在的元素进行分组。在您的情况下,您尝试获取其UserApproveLevel_Two_T属性设置为True

的元素

您可以使用GroupBy()子句代替Where()以获得预期的结果

 var sky = DB.UserSkypeTrackers.Where(x => x.UserApproveLevel_Two_T).FirstOrDefault();

奖金:

当您根据bool变量检查条件时,无需检查== true条件,.Where(x => x.UserApproveLevel_Two_T)将代替.Where(x => x.UserApproveLevel_Two_T == true)起作用

sky变量包含单个记录,因为您在where子句后调用FirstOrDefault();。这里FirstOrDefault()将返回集合中的单个元素或默认值。因此,无需遍历sky