LINQ to Entities错误

时间:2017-09-29 07:59:31

标签: c# linq

我有一个包含List<>的视图模型。此列表是另一个模型的集合,我正在尝试填充此列表,同时填充IEnumerable我的视图模型。在执行此操作时,我收到错误“LINQ to Entities中仅支持无参数构造函数和初始值设定项”。错误来自于Locations = new List<>部分我尝试填充列表。我想知道的是如何以正确的方式填写此列表。

代码:

IEnumerable<PickListLineViewModel> lineList = dbEntity.PickListLine
    .Where(i => i.PickID == id && i.Status != "C")
    .Select(listline => new PickListLineViewModel
    {
        ArticleName = dbEntity.Item
                        .Where(i => i.ItemId == dbEntity.SalesOrderLine
                                .Where(idb => idb.DocId == listline.BaseDocID &&
                                            idb.DocType.Equals(listline.BaseDocType) &&
                                            idb.LineNum == listline.BaseLineNum)
                                .Select(iid => iid.ItemId)
                                .FirstOrDefault())
                        .Select(p => p.Description)
                        .FirstOrDefault(),
        PickID = listline.PickID,
        BaseDocID = listline.BaseDocID,
        BaseDocType = listline.BaseDocType,
        BaseLineNum = listline.BaseLineNum,
        LineNum = listline.LineNum,
        Quantity = listline.Quantity,
        ReleasedByQty = listline.ReleasedByQty,
        Status = listline.Status,
        PickedQuantity = listline.PickedQuantity,

        Locations = new List<BinLocationItemModel>(dbEntity.BinLocation_Item
                        .Where(t => t.ItemId == dbEntity.SalesOrderLine
                                .Where(idb => idb.DocId == listline.BaseDocID &&
                                            idb.DocType.Equals(listline.BaseDocType) &&
                                            idb.LineNum == listline.BaseLineNum)
                                .Select(iid => iid.ItemId)
                                .FirstOrDefault())
                        .Select(locitem => new BinLocationItemModel
                        {
                            ItemId = locitem.ItemId,
                            Barcode = locitem.BinLocation.Barcode,
                            BinLocationCode = locitem.BinLocation.BinLocationCode,
                            BinLocationId = locitem.BinLocationId,
                            BinLocationItemId = locitem.ItemId,
                            StockAvailable = locitem.StockAvailable
                        }))
                        .ToList(),

        ArticleID = dbEntity.Item
                        .Where(i => i.ItemId == dbEntity.SalesOrderLine
                                .Where(idb => idb.DocId == listline.BaseDocID &&
                                                idb.DocType.Equals(listline.BaseDocType) &&
                                                idb.LineNum == listline.BaseLineNum)
                                .Select(iid => iid.ItemId)
                                .FirstOrDefault())
                        .Select(p => p.ItemCode)
                        .FirstOrDefault()
    })
    .AsEnumerable();

BinLocationItemModel:

public class BinLocationItemModel
{
    [Required]
    public int BinLocationItemId { get; set; }
    public string Barcode { get; set; }
    public string BinLocationCode { get; set; }
    [Required]
    public int BinLocationId { get; set; }
    [Required]
    public int ItemId { get; set; }
    public decimal? StockAvailable { get; set; }
}

1 个答案:

答案 0 :(得分:0)

在PickListLineViewModel构造函数中,您应该初始化您的位置列表,如下所示

    
     public class PickListLineViewModel
     {
         public PickListLineViewModel()
         {
            Locations = new List<BinLocationItemModel>();
         }
         public List <BinLocationItemModel> Locations { get; set; }
     }

     public class BinLocationItemModel
     {
         ....
     }
    

然后,对于你的linq查询,你应该能够执行以下操作,你不需要linq中的新列表:

    Locations = dbEntity.BinLocation_Item
                    .Where(t => t.ItemId == dbEntity.SalesOrderLine
                            .Where(idb => idb.DocId == listline.BaseDocID &&
                                 idb.DocType.Equals(listline.BaseDocType) &&
                                        idb.LineNum == listline.BaseLineNum)
                            .Select(iid => iid.ItemId)
                            .FirstOrDefault())
                    .Select(locitem => new BinLocationItemModel
                    {
                        ItemId = locitem.ItemId,
                        Barcode = locitem.BinLocation.Barcode,
                        BinLocationCode = locitem.BinLocation.BinLocationCode,
                        BinLocationId = locitem.BinLocationId,
                        BinLocationItemId = locitem.ItemId,
                        StockAvailable = locitem.StockAvailable
                    })
                    .ToList(),