简体   繁体   English

Linq ToArray在ToArray中出错

[英]Linq ToArray in ToArray error

I'm trying to make a array of my model (Basket) with Linq and in that model i have another array, so when i'm creating that model with link i got this error: 我正在尝试使用Linq制作我的模型(Basket)的数组,并且在该模型中我有另一个数组,所以当我用链接创建该模型时我得到了这个错误:

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
LINQ to Entities does not recognize the method 'HTTP.Webshop.API.WebAPI.Models.BasketLine[] ToArray[BasketLine](System.Collections.Generic.IEnumerable`1[HTTP.Webshop.API.WebAPI.Models.BasketLine])' method, and this method cannot be translated into a store expression.
</ExceptionMessage>
<ExceptionType>System.NotSupportedException</ExceptionType>
<StackTrace>
at System.Web.Http.ApiController.<InvokeActionWithExceptionFilters>d__1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
</StackTrace>
</Error>

I don't get an error when i return just one Basket model (with only the array of BasketLines). 当我只返回一个Basket模型(只有BasketLines数组)时,我没有收到错误。

My code is: 我的代码是:

return basketManager.GetList(context).Select(b => new Models.Basket
                {
                    BasketId = b.BasketId,
                    CustomerId = b.CustomerId,
                    UserId = b.UserId,
                    ASPNETSessionId = b.ASPNETSessionId,
                    Created = b.Created,
                    CreatedOrder = b.CreatedOrder,
                    ShipmentMethodId = b.ShipmentMethodId,
                    ShipmentMethodName = (b.ShipmentMethod != null) ? b.ShipmentMethod.Description : null,
                    ShippingDocument = b.ShippingDocument,
                    VoucherCode = b.VoucherCode,
                    LockedSince = b.LockedSince,
                    PickupLocationId = b.PickupLocationId,
                    Reference = b.Reference,
                    Comments = b.Comments,
                    PurchaseNumber = b.PurchaseNumber,
                    DesiredDeliveryDate = b.DesiredDeliveryDate,
                    CompanyNameDelivery = b.CompanyNameDelivery,
                    NameDelivery = b.NameDelivery,
                    AddressDelivery = b.AddressDelivery,
                    Address2Delivery = b.Address2Delivery,
                    PostalCodeDeliver = b.PostalCodeDelivery,
                    CityDelivery = b.CityDelivery,
                    CountryISOCodeDelivery = b.CountryISOCodeDelivery,
                    InvoiceDiscount = b.InvoiceDiscount,
                    Modified = b.Modified,
                    BasketLines = b.BasketLines.Select(bl => new Models.BasketLine
                    {
                        BasketLineId = bl.BasketLineId,
                        BasketId = bl.BasketId,
                        ProductId = bl.ProductId,
                        ProductName = bl.Product.Name,
                        ProductVariantId = bl.ProductVariantId,
                        ProductVariantName = bl.ProductVariant.Name,
                        Quantity = bl.Quantity,
                        QuantityByPiece = bl.QuantityByPiece,
                        VATPercentage = bl.VATPercentage,
                        Amount = bl.Amount,
                        CalculatorAmount = bl.CalculatorAmount,
                        Discount = bl.Discount,
                        Reference = bl.Reference,
                        Comments = bl.Comments,
                        LockedSince = bl.LockedSince,
                        StockNr = bl.StockNr,
                        Created = bl.Created,
                        Modified = bl.Modified
                    }).ToArray()
                }).ToArray();

Since GetList returns IQueryable the actual SQL query is not executed until the last ToArray is called. 由于GetList返回IQueryable在调用最后一个ToArray之前不会执行实际的SQL查询。 So what happens here is that LINQ to SQL tries to translate whole your query into the SQL. 所以这里发生的是LINQ to SQL尝试将整个查询转换为SQL。 Of course there is no ToArray analogue in SQL, and the translation fails. 当然,SQL中没有ToArray模拟,并且转换失败。

What you can do is to run the query before you start projection onto the model: 您可以做的是开始投影到模型之前运行查询:

basketManager.GetList(context).ToList().Select(...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM