如何为每个设置List子元素如果它最初为空?

时间:2018-06-12 20:29:53

标签: c# .net-core entity-framework-core

我有Ilist使用实体框架核心从存储库获取所有Offer。我也有服务模型OfferResponseModel,其中包括 OfferRequestModel作为参考。我使用mapster将实体模型绑定到服务模型。然而它只设置了第一个孩子。现在我想手动绑定它。我创建了“优惠”大小的“优惠”。当我尝试使用foreach循环时,我无法设置“offers”子元素。因为它没有元素。所以,我可以解决这个问题。

var offer = await _unitOfWork.Offers.GetAllOffer();

if (offer == null)
    throw ServiceExceptions.OfferNotFound;

var results = new List<OfferResponseModel>(offer.Count);
results.ForEach(c => { c.Offer = new OfferRequestModel(); });

int i = 0;

foreach(var result in results)
{
    result.Offer.User = Offer[i].User.Adapt<UserResponseModel>();
    result.Offer.Responsible = Offer[i].Responsible.Adapt<EmployeeResponseModel>();
    result.CreatedDate = Offer[i].CreatedDate;
    result.ModifiedBy = Guid.Parse(Offer[i].UpdatedBy);
    result.Active = Offer[i].Status;
    result.Offer = Offer[i].Offer;
    result.Offer.User.Company = Offer[i].Company.Adapt<CompanyModel>();
    i++;
}

2 个答案:

答案 0 :(得分:0)

  

我创建了&#34;提供&#34;大小为&#34;提供&#34;。

不,您使用容量创建了它。它仍然是一个空列表。我不清楚为什么你要尝试采用这种方法 - 看起来你想要OfferResponseModel中的每个条目offer,直接来自那个 - 你可以使用单个LINQ查询。 (我假设此处offerOffer相同。)

var results = Offer.Select(o => new OfferResponseModel
    {
        Offer = new OfferRequestModel
        { 
            User = o.User.Adapt<UserResponseModel>(),
            Responsible = o.Responsible.Adapt<EmployeeResponseModel>()
        },
        CreatedDate = o.CreatedDate,
        ModifiedBy = Guid.Parse(o.UpdatedBy),
        Active = o.Status
    }).ToList();

这并没有在每个条目中设置Offer.User.Company,但您的原始代码很奇怪,因为它设置了原始User中的ResponsibleOffer属性属性,然后将Offer替换为Offer[i].Offer。 (除了其他任何事情,我建议尝试使用术语&#34;提供&#34;不那么频繁 - 只需将复数改为&#34;提供&#34;会有所帮助。)

我怀疑通过上面概述的方法,您将能够找到您想要的东西,并且无论如何都能更清楚地表达出来。你绝对不需要采取&#34;多重循环&#34;你的原始代码的方法。

答案 1 :(得分:0)

您遗漏的一件事是代码中引用的offer变量的类型。但我认为你需要做这些事情:

if (offer == null)
    throw ServiceExceptions.OfferNotFound;

var results = offer.Select(o => new OfferResponseModel 
{
    Offer = new OfferRequestModel 
    {
        User = o.User.Adapt<UserResponseModel>(),
        Responsible = o.Responsible.Adapt<EmployeeResponseModel>(),
        ...
    }
}).ToList();

Select基本上遍历offer中的所有项目并将其“转换”为其他对象,在本例中为OfferResponseModel。所以在里面选择你只是新建一个OfferResponseModel并直接设置你需要设置的所有属性。

您需要using System.Linq;才能选择此选项。