программно добавить идентификатор ключа столбца linq - PullRequest
0 голосов
/ 06 января 2020

Под ASP net core 3.1. У меня есть Entity Framework query, который создает List<Type> следующим образом:

   var opts = _context.Opt_I30                        
             .Where(x => x.UnderlyingSymbol == "SPX" && x.QuoteDatetime < dt)
             .Select(x => new { x.UnderlyingSymbol, x.QuoteDatetime, x.Expiration, x.Strike, 
                                x.OptionType, x.Bid, x.Ask, x.UnderlyingBid, x.UnderlyingAsk, x.IV })
             .OrderBy(x => x.QuoteDatetime)
             .ThenBy(x => x.Expiration)
             .ThenBy(x => x.OptionType)
             .ThenBy(x => x.Strike)
             .ToList()
             ;

В Select как добавить уникальный идентификатор в строки ? Это не похоже на работу:

long id = 0;
new { id++, x.UnderlyingSymbol, x.QuoteDatetime, x.Expiration, x.Strike, 
                                    x.OptionType, x.Bid, x.Ask, x.UnderlyingBid, x.UnderlyingAsk, x.IV })

РЕДАКТИРОВАТЬ 1

Если я попытаюсь изменить select на это:

Select((x, index) => new { index, x.UnderlyingSymbol, x.QuoteDatetime, x.Expiration, x.Strike, 
                                            x.OptionType, x.Bid, x.Ask, x.UnderlyingBid, x.UnderlyingAsk, x.IV })

Я получаю исключение:

An unhandled exception occurred while processing the request.
NotSupportedException: Could not parse expression 'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[OptionsAPI.Entities.Option]).Where(x => ((x.UnderlyingSymbol == "SPX") AndAlso (x.QuoteDatetime < __dt_0))).Select((x, index) => new <>f__AnonymousType0`11(index = index, UnderlyingSymbol = x.UnderlyingSymbol, QuoteDatetime = x.QuoteDatetime, Expiration = x.Expiration, Strike = x.Strike, OptionType = x.OptionType, Bid = x.Bid, Ask = x.Ask, UnderlyingBid = x.UnderlyingBid, UnderlyingAsk = x.UnderlyingAsk, IV = x.IV))': This overload of the method 'System.Linq.Queryable.Select' is currently not supported.
Remotion.Linq.Parsing.Structure.MethodCallExpressionParser.GetNodeType(MethodCallExpression expressionToParse)

Stack Query Cookies Headers Routing
NotSupportedException: Could not parse expression 'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[OptionsAPI.Entities.Option]).Where(x => ((x.UnderlyingSymbol == "SPX") AndAlso (x.QuoteDatetime < __dt_0))).Select((x, index) => new <>f__AnonymousType0`11(index = index, UnderlyingSymbol = x.UnderlyingSymbol, QuoteDatetime = x.QuoteDatetime, Expiration = x.Expiration, Strike = x.Strike, OptionType = x.OptionType, Bid = x.Bid, Ask = x.Ask, UnderlyingBid = x.UnderlyingBid, UnderlyingAsk = x.UnderlyingAsk, IV = x.IV))': This overload of the method 'System.Linq.Queryable.Select' is currently not supported.

....

Ответы [ 2 ]

1 голос
/ 06 января 2020

Используя предложения комментариев, ответом является вставка идентификатора в список следующим образом:

var opts = _context.Opt_I30                        
                         .Where(x => x.UnderlyingSymbol == "SPX" && x.QuoteDatetime < dt)
                         .Select(x => new Option{ UnderlyingSymbol = x.UnderlyingSymbol, 
                                                  QuoteDatetime = x.QuoteDatetime, 
                                                  Expiration = x.Expiration, 
                                                  Strike = x.Strike, 
                                                  OptionType = x.OptionType, 
                                                  Bid = x.Bid, 
                                                  Ask = x.Ask, 
                                                  UnderlyingBid = x.UnderlyingBid, 
                                                  UnderlyingAsk = x.UnderlyingAsk, 
                                                  IV = x.IV })
                         .OrderBy(x => x.QuoteDatetime)
                         .ThenBy(x => x.Expiration)
                         .ThenBy(x => x.OptionType)
                         .ThenBy(x => x.Strike)
                         .ToList()
                         ;

               var newopts = opts.Select((x, i) => new { i, x.UnderlyingSymbol, x.QuoteDatetime, x.Expiration, x.Strike, 
                                                  x.OptionType, x.Bid, x.Ask, x.UnderlyingBid, x.UnderlyingAsk });

               return Ok(newopts);
1 голос
/ 06 января 2020

IEnumerable.Select метод имеет перегрузку, которая представляет собой целочисленный индекс в исходной коллекции, вы можете попробовать использовать его в качестве индекса и идентификатора для строки

.Select((x, i) => new { x.UnderlyingSymbol, x.QuoteDatetime, x.Expiration, x.Strike, 
                                x.OptionType, x.Bid, x.Ask, x.UnderlyingBid, x.UnderlyingAsk, i })

Поскольку вы при использовании EF Core ваши Linq методы возвращают IQueryable вместо IEnumerable. В этом случае имеет смысл использовать перегрузку Select после оценки результатов ToList(). Тогда вы сможете добавить необходимый индекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...