为了账号安全,请及时绑定邮箱和手机立即绑定

使用 linq 根据其他列值检索行值

使用 linq 根据其他列值检索行值

C#
梵蒂冈之花 2021-12-25 16:21:21
我有三个数据表,基本上包含以下数据:表格1:ID      FContractID     | WaitingTime1   |   1       |       852   |   1       |       983   |   1       |       1224   |   1       |       455   |   1       |       2346   |   1       |       101等等。表 2:PricingCriterionItemId  PricingCriterionName        PricingCriterionUnit1                   |   WaitingTimeMax          |   min2                   |   WaitingTimePeriod       |   min3                   |   WaitingTimeOverdue      |   €/period4                   |   OverDuePriceMax         |   €表3:PricingCriterionId      ContractID      PricingCriterionItemId      PricingCriterionValue1                   |   1           |   1                       |   702                   |   1           |   2                       |   303                   |   1           |   3                       |   30,004                   |   1           |   4                       |   120,00我想在表 1 中添加一个包含等待时间成本的列。等待时间成本将计算如下WaitingTimeCost = min(((WaitingTime - WaitingTimeMax) / WaitingTimePeriod) * WaitingTimeOverdue, OverDuePriceMax)是否可以使用 linq 使用其他列值在特定行上分配列值?就像是  var result = from WaitingData in table1                join PricingCriteria in table4                 on WaitingData.ContractId equals PricingCriteria.ContractId                let WaitingTimeMax = (select PricingCriterionValue from table4 where PricingCriterionName = "WaitingTimeMax")                let ...                let WaitingTimeCost = min(((WaitingTime - WaitingTimeMax) / WaitingTimePeriod) * WaitingTimeOverdue, OverDuePriceMax)                select new                {                    ID,                    WaitingTimeCost                }如何使用 linq 正确地制定这个?
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

您不需要在数据库查询中执行所有操作。

数据库只是IO设备,只负责读写数据。


加载所有需要的数据并计算。


var contractsId = waitingData.Select(data => data.ContractId).ToList();

var pricingCriterias = table4.Where(criteria => contractsId.Contains(criteria.ContractId)

                             .ToLookup(criteria => criteria.ContractId);


var maxWaitingTime = 

    pricingCriterias.SelectMany(group => group)

                    .Where(criteria => criteria.PricingCriterionName = "WaitingTimeMax")

                    .Max(criteria => criteria.PricingCriterionValue);


foreach (var waitingItem in waitingData)

{

    // Calculate others waiting values


    var waitingPerPeriod = (WaitingTime - maxWaitingTime) / WaitingTimePeriod);

    var waitingPrice = waitingPerPeriod * WaitingTimeOverdue;

    var WaitingTimeCost = Math.Min(waitingPrice, OverDuePriceMax)

}

下面的示例与DataTables.

然而,它DataTable是沉重且非强类型的数据结构,作为开发人员需要更多的时间来处理它。


而是将数据转换DataTable为具有描述性属性名称的普通强类型对象 - 您将免费获得 IntelliSense ;)


var contractsId = 

    waitingData.AsEnumerable()

               .Select(row => row.Field<int>("ContractId"))

               .ToList();

var pricingCriterias = 

    table4.AsEnumerable()

          .Where(row => contractsId.Contains(row => row.Field<int>("ContractId"))

          .ToLookup(row => row.Field<int>("ContractId"));


var maxWaitingTime = 

    pricingCriterias.SelectMany(group => group)

                    .Where(row => row.Field<string>("PricingCriterionName") = "WaitingTimeMax")

                    .Max(row => row.Field<int>("PricingCriterionValue"));


foreach (var waitingItem in waitingData)

{

    // Calculate others waiting values


    var waitingPerPeriod = (WaitingTime - maxWaitingTime) / WaitingTimePeriod);

    var waitingPrice = waitingPerPeriod * WaitingTimeOverdue;

    var WaitingTimeCost = Math.Min(waitingPrice, OverDuePriceMax)

}


查看完整回答
反对 回复 2021-12-25
  • 1 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信