我的桌子
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中
为什么我看到错误的结果?
谢谢
答案 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
查找组,或者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