#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