Невозможно установить случайный порядок при использовании LinqToExcel

#c# #list #linq #linq-to-excel

#c# #Список #linq #linq-to-excel

Вопрос:

Я использую проект LinqToExcel, разработанный MIT и размещенный в Google Code по адресуhttp://code.google.com/p/linqtoexcel/wiki/UsingLinqToExcel для анализа моего набора данных из таблицы Excel, которая выглядит примерно так:

Часть набора данных

Я пытаюсь случайным образом выбрать 30 строк Excel из моего набора данных, содержащих площадь и длину, используя Linq OrderBy метод случайных чисел, рассмотренный здесь:

 public class Obj
{
    public double Area { get; set; }
    public double Length { get; set; }
}

namespace LinqToExcel.Screencast
{
    class Program
    {
        static void Main()
        {
            var excel = new ExcelQueryFactory();
            excel.FileName = @"C:\radno\jame.xls";

            Random rnd = new Random();

            var listExcel = from x in excel.Worksheet<Obj>()
                select x;

            var orderedList = listExcel.OrderBy(r => rnd.Next());

            foreach (var u in orderedList.Take(30))
            {
                Console.WriteLine($"the area is {u.Area} while length is {u.Length}");
            }
        }
    }
}
  

Но это не работает, потому что я всегда получаю одни и те же первые 30 пар. Я делаю что-то не так здесь? Должно ли это работать и является ли это ошибкой LinqToExcel?

Я попробовал этот list.OrderBy(x => Guid.NewGuid()) трюк, но получаю те же результаты.

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

1. Вероятно, это та же проблема, с которой вы сталкиваетесь при использовании Linq-to-SQL, когда ваш запрос (который абсолютно корректен в C #) не может быть переведен на целевой язык (SQL / любой другой, который использует ExcelQueryFactory). Но я раньше не работал с ExcelQueryFactory, поэтому не могу напрямую подтвердить это.

Ответ №1:

Похоже, что OrderBy может работать только тогда, когда вы указываете на точный столбец. Я проверил исходные тексты libary. Если вы перейдете к: https://github.com/paulyoder/LinqToExcel/blob/master/src/LinqToExcel/Query/SqlGeneratorQueryModelVisitor.cs (строка 113) Вы можете увидеть, что берется для упорядочивания с помощью SQL. Он игнорирует любые вызовы методов и сохраняет только имя столбца. При таком подходе это не сработает. В качестве обходного пути вы можете сделать это .ToList() раньше .OrderBy() .

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

1. Вот и все, это сработало! Когда я добавлял .ToList() раньше .OrderBy() , это сработало. Потрудитесь объяснить, что происходит под капотом при добавлении .ToList() в этом случае? Спасибо.

2. ToList создает обычный объект списка с элементами. Прежде чем вы это сделаете, это IQueryable из LinqToExcel, который не поддерживает orderby, как вы пытались. Вам следует прочитать несколько статей об IQueryable и IEnumerable