Я считаю, что это связано с тем, как выражение хранится и оценивается. Это определенно ошибка, но я не уверен, что это будет исправлено в будущем.
Я настроил разбиение на страницы в своем проекте с помощью универсального класса, который в конечном итоге создает выражение из типов значений. (Обратите внимание, что есть неиспользуемые свойства и поля, так как я оставил некоторый специфичный для домена код из логики)
public class Pagination<T>
{
public IQueryable<T> Items;
public int CurrentPageNumber { get; }
public int PageSize { get; }
public int StartPage { get; }
public int TotalPages { get; set; }
public Pagination(IQueryable<T> items, int pageNumber, int pageSize)
{
if (pageNumber <= 0)
{
throw new ArgumentOutOfRangeException(nameof(pageNumber));
}
if (pageSize <= 0)
{
throw new ArgumentOutOfRangeException(nameof(pageSize));
}
if (((decimal)DisplayPages % 2) == 0)
{
throw new ArgumentOutOfRangeException(nameof(DisplayPages), "Number of pages to render must be odd.");
}
Items = items;
CurrentPageNumber = pageNumber;
PageSize = pageSize;
StartPage = 1;
if (items.Any())
{
var rowCount = items.Count();
TotalPages = (int)Math.Ceiling((decimal)rowCount / PageSize);
}
else
{
TotalPages = 1;
}
}
public IQueryable<T> GetPageData()
{
return Items.Skip((CurrentPageNumber - 1) * PageSize).Take(PageSize) ?? new List<T>().AsQueryable();
}
}
Тогда вы можете использовать его следующим образом:
var paginatedObjects = new Pagination<Type>(query, 1, 10)
{
//Options if nessasary
};
paginatedObjects.GetPageData();
sort -t , -k index1 file1 > sorted1
sort -t , -k index2 file2 > sorted2
join -t , -1 index1 -2 index2 -a 1 -a 2 sorted1 sorted2
Вам нужно взглянуть на команду join
в оболочке. Вам также нужно будет отсортировать данные и, возможно, потерять первые строки. Весь процесс потерпит неудачу, если какие-либо данные содержат запятые. Или вам нужно будет обработать данные с помощью CSV-чувствительного процесса, который вводит другой разделитель полей (возможно, control-A), который вы можете использовать для однозначного разделения полей.
Альтернатива, использующая Python, считывает два файла в пара словарей (с указанием общего столбца (столбцов)), а затем используйте цикл, чтобы охватить все элементы в меньшем из двух словарей, ища совпадающие значения в другом. (Это базовая обработка запросов во вложенных циклах.)
Похоже, вы пытаетесь сделать это с помощью сценария оболочки, который обычно выполняется с помощью сервера SQL. Можно ли использовать SQL для этой задачи? Например, вы можете импортировать оба файла в mysql, затем создать объединение, а затем экспортировать его в CSV.
Вы можете взглянуть на мой проект FOSS CSVfix , который является потоковым редактором для манипулирования файлами CSV. Помимо других функций, он поддерживает объединения и не требует использования сценариев.
Это классическая проблема «реляционного объединения».
У вас есть несколько алгоритмов.
Вложенные циклы. Вы читаете из одного файла, чтобы выбрать «основную» запись. Вы читаете весь другой файл, находя все «подробные» записи, которые соответствуют основному. Это плохая идея.
Sort-Merge. Вы сортируете каждый файл во временную копию на основе общего ключа. Затем вы объединяете оба файла, читая из мастера, а затем читая все соответствующие строки из детали и записывая объединенные записи.
Lookup. Вы читаете один из файлов целиком в словарь в памяти, проиндексированный по ключевому полю. Это может быть сложно для подробного файла, где у вас будет несколько дочерних элементов на ключ. Затем вы читаете другой файл и ищите соответствующие записи в словаре.
Из них сортировка слиянием часто является самой быстрой. Это делается полностью с помощью команды unix sort .
Реализация поиска
import csv
import collections
index = collections.defaultdict(list)
file1= open( "someFile", "rb" )
rdr= csv.DictReader( file1 )
for row in rdr:
index[row['MPID']].append( row )
file1.close()
file2= open( "anotherFile", "rb" )
rdr= csv.DictReader( file2 )
for row in rdr:
print row, index[row['MPID']]
file2.close()