LINQ Group по неверным результатам - PullRequest
2 голосов
/ 29 июня 2019

Мой стол

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 голосов
/ 29 июня 2019

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 содержит одну запись при вызове FirstOrDefault(); после оператора where. Здесь FirstOrDefault() вернет отдельный элемент или значение по умолчанию из коллекции. Так что нет необходимости перебирать sky

0 голосов
/ 29 июня 2019

Метод Enumerable.GroupBy в LINQ to Objects сохраняет порядок группировок в соответствии с документами:

Объекты IGrouping<TKey,TElement> выдаются в порядке, основанном на порядке элементов в source, которые производили первый ключ каждого IGrouping<TKey,TElement>. Элементы в группировке приводятся в порядке их появления в source.

Что, вероятно, вы ожидали увидеть 111....

Однако, вы, похоже, используете GroupBy для таблицы базы данных или что-то в этом роде. Это означает, что вы используете Queryable.GroupBy. Согласно его документам,

Поведение запроса, возникающее в результате выполнения дерева выражений, представляющего вызов GroupBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>), зависит от реализации типа параметра источника. Ожидаемое поведение состоит в том, что он группирует элементы источника по значению ключа, которое получается путем вызова keySelector для каждого элемента.

Как видите, точное поведение зависит от реализации и не требует сохранения порядка. Поэтому первая IGrouping не обязательно является группой с ключом true.

Таким образом, чтобы получить желаемые результаты, либо:

  • используйте Where, чтобы найти группу с ключом true или
  • Сначала загрузите все объекты в память, затем используйте LINQ to Object GroupBy. (Это может быть медленно, если у вас много объектов в базе данных)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...