【问题标题】:How to set List child element with for each If it is empty initially?如果最初为空,如何为每个子元素设置列表子元素?
【发布时间】:2018-06-12 20:29:52
【问题描述】:

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

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++;
}

【问题讨论】:

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


    【解决方案1】:

    我创建了“报价”大小的“报价”。

    不,你是用那个容量创建的。它仍然是一个空列表。我不清楚您为什么要尝试采用这种方法 - 看起来您想要一个 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,但是您的原始代码很奇怪,因为它在原始Offer 属性中设置了UserResponsible 属性,然后将Offer 替换为Offer[i].Offer。 (除此之外,我建议尽量少使用“offer”一词——只需将复数形式改为“offers”即可。)

    我怀疑通过我上面概述的方法,您将能够计算出您想要的内容并更清楚地表达出来。您绝对不需要采用原始代码的“多循环”方法。

    【讨论】:

      【解决方案2】:

      您遗漏了代码中引用的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。所以在 select 里面你只需新建一个 OfferResponseModel 并直接设置你需要设置的所有属性。

      您需要 using System.Linq; 才能使用 Select。

      【讨论】:

      • @Daisy 领先我 30 秒,看起来几乎是相同的答案 :)
      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2021-12-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多