【问题标题】:Is there any way in LINQ to pass value from the selected objectLINQ 中是否有任何方法可以从选定对象传递值
【发布时间】:2021-04-23 06:38:52
【问题描述】:
MedicalPrescription.CreditItemDetails = 
    (from MB in WYNKContext.MedicalBillMaster.Where(x => x.TransactionId == TC && x.CMPID == CmpID && x.ID == MedBillID )
        join med in WYNKContext.MedicalBillTran on MB.ID equals med.MedicalBillID
         select new CreditItemDetails
         {
            Amount = med.ReturnQuantity != null ? Convert.ToDecimal(med.ReturnQuantity) * Convert.ToDecimal(med.ItemRate) : Convert.ToDecimal(med.Quantity) * Convert.ToDecimal(med.ItemRate),
            GrossAmount =  (med.ReturnQuantity != null ? Convert.ToDecimal(med.ReturnQuantity) * Convert.ToDecimal(med.ItemRate) : Convert.ToDecimal(med.Quantity) * Convert.ToDecimal(med.ItemRate)) - Convert.ToDecimal(med.DiscountAmount),
            // some more properties
        }).ToList();

如何在选定的新 CreditItemDetails 中使用结果值进行进一步计算... 例子 *如果我们在金额中获得值以进行进一步计算,我需要在另一个计算中传递结果值,以计算总金额 = 结果金额值 * 折扣 / 100 像这样我需要这样做.. 有没有办法做到这一点。提前致谢

【问题讨论】:

  • 只读属性呢?

标签: c# linq .net-core lambda


【解决方案1】:

我建议你将任何计算的责任从 linq 转移给对象自己。

您可以像这样创建 get only 道具:

public CreditItemDetails()
{
    public decimal Grossamount => Amount * GrossAmount / 100
}

【讨论】:

    【解决方案2】:

    也许你需要让

    MedicalPrescription.CreditItemDetails = 
    (from MB in WYNKContext.MedicalBillMaster.Where(x => x.TransactionId == TC && x.CMPID == CmpID && x.ID == MedBillID )
        join med in WYNKContext.MedicalBillTran on MB.ID equals med.MedicalBillID
         let Amount = med.ReturnQuantity != null ? Convert.ToDecimal(med.ReturnQuantity) * Convert.ToDecimal(med.ItemRate) : Convert.ToDecimal(med.Quantity) * Convert.ToDecimal(med.ItemRate),
         select new CreditItemDetails
         {
            Amount = Amount,
            Grossamount = Amount * Discount / 100
        }).ToList();
    

    Let

    【讨论】:

      【解决方案3】:

      选项 A.let 子句

      你可以使用 let 子句:

      string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
      IEnumerable<string> queryFirstNames =
         from name in names
         let firstName = name.Split(' ')[0]
         select firstName;
      
      foreach (string s in queryFirstNames)
         Console.Write(s + " ");
      //Output: Svetlana Claire Sven Cesar
      

      参考:let 子句 in Query expression basics

      选项 B. 使用中间对象

      ...
      select
               {
                  (decimal?) med.ReturnQuantity,
                  (decimal?) med.ItemRate
                  (decimal?) med.Quantity
                  ...
              }).ToList() // Hit the database, it may not be necessary
                .Select( med => new 
                     {
                         Amount = ...
                         ...
                     })
                .Select( med => new CreditItemDetails
                     {
                         Amount,
                         GrossAmount = Amount * xxx
                     });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多