Нельзя случайный порядок при использовании LinqToExcel - PullRequest
1 голос
/ 18 марта 2019

Я использую проект 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 Ответ

0 голосов
/ 18 марта 2019

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

...