Linq приводит к исчезновению коллекции при попытке использовать OrderByDescending

#c# #.net #linq #mongodb

#c# #.net #linq #mongodb

Вопрос:

Для фона я использую MongoDB и драйвер linq от Роба Конери. Таким образом, код, который я пытаюсь:

 using (var session = new Session<ContentItem>())
{
    var contentCollection = session.QueryCollection.Where(x => x.CreatedOn < DateTime.Now).OrderByDescending(y => y.CreatedOn).ToList();
    ViewData.Model = contentCollection;
}
  

это сработает на одной машине, но на другой машине я не получаю никаких результатов. Чтобы получить результаты, я должен сделать

 using (var session = new Session<ContentItem>())
{
    var contentCollection = session.QueryCollection.Where(x => x.CreatedOn < DateTime.Now).ToList();
    ViewData.Model = contentCollection.OrderByDescending(y => y.CreatedOn).ToList();
}
  

Я должен выполнить ToList() в обеих строках, иначе результатов не будет. Если я пытаюсь связать что-либо в цепочку, это ломается. Это тот же проект, все dll загружены локально. Обе машины имеют одинаковую платформу, версии Visual Studio и дополнения. разница лишь в том, что у одного есть VisualSVN, а у другого AnkhSVN. Я не вижу тех, кто вызывает проблему.

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

Комментарии:

1. Возможно, это связано с интерпретацией окончаний строк различными движками svn… Это долгий путь, но это все, что у меня есть…

Ответ №1:

Для меня это звучит подозрительно, как старая добрая ошибка в поставщике LINQ MongoDB. Что произойдет, если вы попробуете приведенный ниже код? Возвращает ли он все элементы в обратном порядке по дате? Если это так, возможно, поставщик LINQ просто не поддерживает сложные запросы.

 using (var session = new Session<ContextItem>())
{
    var allByDateReverse =
        session.QueryCollection.OrderByDescending(x => x.CreatedOn);
    ViewData.Model = allByDateReverse.ToList();
}
  

Комментарии:

1. Спасибо за предложение. Поставщик поддерживает запрос, поскольку он работает на первом компьютере. Это моя вторая машина для разработки, на которой запрос не работает. Как я уже говорил, весь код одинаков, извлечен из того же репозитория svn.

Ответ №2:

Каково содержимое x.CreatedOn ? Запрос

Где(x => x.CreatedOn < DateTime.Now)

не выполняется до тех пор, пока contentCollection фактически не будет использован. Во втором примере ToList() вызывает немедленное выполнение запроса, в то время как объединенный Where(..).OrderByDescending(..) может быть выполнен позже (не знаю, что такое ViewData.Модель делает). Возможно, это связано с некоторыми странными проблемами с синхронизацией.