Генерация порядкового номера из linq2db без материализацииC#

Место общения программистов C#
Ответить
Anonymous
 Генерация порядкового номера из linq2db без материализации

Сообщение Anonymous »

У меня есть метод, который получает элементы и присваивает порядковый номер. Порядковый номер соответствует номеру элемента, указанному в поле TurnedOffOn.

Код: Выделить всё

public IQueryable Query(bool includeRelated = false)
{
var allItems = _context.GetTable().AsQueryable();

if (includeRelated)
{
allItems = allItems
.LoadWith(r => r.Request).ThenLoad(w => w.Addresses)
.LoadWith(r => r.Request).ThenLoad(w => w.TurnedOffObjects)
.LoadWith(r => r.Request).ThenLoad(w => w.Executor)
.LoadWith(r => r.District)
.LoadWith(r => r.RospotrebnadzorNotes);
}

var orderedItems = allItems.OrderBy(log => log.TurnedOffOn);

var numberedItems = orderedItems.ToArray();

for ( var i = 0; i< numberedItems.Length; i++)
{
numberedItems[i].SequenceNumber = i + 1;
}

return numberedItems.AsQueryable();
}
Я хочу сгенерировать порядковый номер без материализации или с помощью ToArray(). Я использую linq2db и пробовал разные способы, но пока ничего не помогло.
Например, это дает исключение:

Код: Выделить всё

var orderedItems = allItems.OrderBy(log => log.TurnedOffOn);

var sequenceNumber = 0;
foreach (var item in orderedItems)
{
item.SequenceNumber = sequenceNumber++;
}

return orderedItems;
И это тоже дает исключение — индекс вне диапазона

Код: Выделить всё

public IQueryable Query(bool includeRelated = false)
{
var allItems = _context.GetTable().AsQueryable();

if (includeRelated)
{
allItems = allItems
.LoadWith(r => r.Request).ThenLoad(w => w.Addresses)
.LoadWith(r => r.Request).ThenLoad(w => w.TurnedOffObjects)
.LoadWith(r => r.Request).ThenLoad(w => w.Executor)
.LoadWith(r => r.District)
.LoadWith(r => r.RospotrebnadzorNotes);
}

var orderedItems = allItems.OrderBy(log => log.TurnedOffOn);

return orderedItems.OrderBy(log => log.TurnedOffOn)
.Select((log, index) => new RequestLog // create a new instance to avoid in memory changes
{
Id = log.Id,
SequenceNumber = index + 1,
// other fields
}).AsQueryable();
}
Дополнение:
Я получил этот запрос

Код: Выделить всё

var query = _store.RequestsLog.Query(true).Where(filter);
метод из репозитория

Код: Выделить всё

public IQueryable Query(bool includeRelated = false)
{
var allItems = _context.GetTable().AsQueryable();

if (includeRelated)
{
allItems = allItems
.LoadWith(r => r.Request).ThenLoad(w => w.Addresses)
.LoadWith(r => r.Request).ThenLoad(w => w.TurnedOffObjects)
.LoadWith(r => r.Request).ThenLoad(w => w.Executor)
.LoadWith(r => r.District)
.LoadWith(r => r.RospotrebnadzorNotes);
}

var orderedItems = allItems.OrderBy(log => log.TurnedOffOn);
return orderedItems.OrderBy(log => log.TurnedOffOn)
.Select(log => new RequestLog
{
Id = log.Id,
SequenceNumber = (int)Sql.Ext.RowNumber().Over().OrderBy(log.TurnedOffOn).ToValue(),
//other fields
});
}
И SqlText этого запроса правильный, если я запускаю в Management Studio, он не выдает никаких ошибок:

Код: Выделить всё

SELECT
[p].[Id],
ROW_NUMBER() OVER(ORDER BY [p].[TurnedOffOn]),
Но вот здесь и возникает исключение:

Код: Выделить всё

var response = OrderItems(query, request.Sort)
.TakePage(request.Page)
.ProjectTo(RequestLogMappers.Mapper.ConfigurationProvider)
.AsPagedList(totalCount);
В методе TakePage поступает запрос со следующим SqlText: "((LinqToDB.Linq.ExpressionQuery)src).SqlText" выдал выражения типа "System.Reflection" .TargetInvocationException"
Это метод OrderBy, в котором, вероятно, возникает проблема:

Код: Выделить всё

public static IOrderedQueryable OrderBy(this IQueryable src, string propertyName, bool reverse = false)
{
var propertyInfo = typeof(T).GetProperty(propertyName);

if (propertyInfo == null)
throw new ArgumentException($"property {propertyName} not found on object {typeof(T).Name}");

var keySelector = BuildKeySelector(propertyInfo);
var targetMethodName = !reverse ? "TargetOrderBy" : "TargetOrderByDescending";
var methodInfo = typeof(QueryableExtensions).GetMethod(targetMethodName, BindingFlags.NonPublic | BindingFlags.Static);

if (methodInfo == null)
throw new Exception($"can't bind to generic target method {targetMethodName}");

var method = methodInfo.MakeGenericMethod(typeof(T), propertyInfo.PropertyType);

return method.Invoke(null, new[] {src, keySelector}) as IOrderedQueryable;
}
Имя свойства, передаваемое методу OrderBy, является правильным и существует в классе RequestLog.
И когда я проверяю внутреннее исключение, подобное этому

Код: Выделить всё

try
{
response = OrderItems(query, request.Sort)
.TakePage(request.Page)
.ProjectTo(RequestLogMappers.Mapper.ConfigurationProvider)
.AsPagedList(totalCount);
}
catch (TargetInvocationException ex)
{
var innerException = ex.InnerException;

}
innerException: Message = «Член «Ext» не найден в типе «FKDH`2»».

Подробнее здесь: https://stackoverflow.com/questions/792 ... ialization
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»