gpt4 book ai didi

c# - 在 LINQ 查询中添加 Lambda 以替换 foreach 中的一行

转载 作者:行者123 更新时间:2023-11-30 18:13:02 37 4
gpt4 key购买 nike

我有一种情况,我必须将一个系统中的多个客户编号与另一个系统中的一个客户编号进行匹配。因此,例如系统 A 中的客户编号 225、228 和 223 将全部映射到系统 B 中的客户编号 110022。很简单,我有一个矩阵设置来做到这一点。

我像这样拉入矩阵数据:

 var dt_th_matrix = (from m in aDb.Matrix_Datatrac_TopHat select m).ToArray();

所以记录会是这样的:

客户 A:3 客户 B:1001

客户 A:4 客户 B:1001

客户 A:5 客户:1002

然后我进行大数据拉取并逐步检查所有项目。对于每个项目,我都会像这样从矩阵中获取匹配的客户编号:

foreach (var dt_stop in mainPull)
{
int? th_customerId = (from d in dt_th_matrix
where d.datatrac_customer_no == dt_stop.Customer_No.ToString()
select d.tophat_customer_detail_Id).First();

我宁愿做的是直接在我的数据拉取中嵌入代码以从矩阵中获取客户编号——我假设“查询以某种方式进入此处”部分将是某种类型的 Lambda。有帮助吗?

我试过这样的:

  th_customerId = (dt_th_matrix.First().tophat_customer_detail_Id.Equals c.Customer_No)

但事实并非如此(显然)

var mainPull = (from c in cDb.DistributionStopInformations
join rh in cDb.DistributionRouteHeaders on c.Route_Code equals rh.Route_Code
where c.Company_No == 1 &&
(accountNumbers.Contains(c.Customer_No)) &&
(brancheSearchList.Contains(c.Branch_Id) && brancheSearchList.Contains(rh.Branch_Id)) &&
c.Shipment_Type == "D" &&
(c.Datetime_Created > dateToSearch || c.Datetime_Updated > dateToSearch) &&
rh.Company_No == 1 &&
((rh.Route_Date == routeDateToSearch && c.Route_Date == routeDateToSearch) ||
(rh.Route_Date == routeDateToSearch.AddDays(1) && c.Route_Date == routeDateToSearch.AddDays(1)))
orderby c.Unique_Id_No
select new
{
c.Datetime_Updated,
th_customerId = ("Query goes here somehow")
c.Datetime_Created,
c.Unique_Id_No,
c.Original_Unique_Id_No,
c.Unique_Id_Of_New_Stop,
c.Branch_Id,
c.Route_Date,
c.Route_Code,
c.Sequence_Code,
c.Customer_No,
c.Customer_Reference,
c.Shipment_Type,
c.Stop_Name,
c.Stop_Address,
c.Stop_City,
c.Stop_State,
c.Stop_Zip_Postal_Code,
c.Stop_Phone_No,
c.Stop_Arrival_Time,
c.Stop_Departure_Time,
c.Address_Point,
c.Stop_Special_Instruction1,
c.Stop_Special_Instruction2,
c.Stop_Expected_Pieces,
c.Stop_Expected_Weight,
c.Stop_Signature,
c.Actual_Arrival_Time,
c.Actual_Depart_Time,
c.Actual_Service_Date,
c.Stop_Actual_Pieces,
c.Stop_Exception_Code,
c.Created_By,
rh_Route_Date = rh.Route_Date,
routeHeaderRouteCode = rh.Route_Code,
rh.Actual_Driver,
rh.Assigned_Driver,
rh_routeDate = rh.Route_Date

}).ToArray();

我会尽力澄清以上内容。

我需要的是 Linq 查询:对于我提取的每条记录,我将转到名为 dt_th_matrix 的数组并获取与该行匹配的记录并使用它。

矩阵中的数据看起来完全像这样:

记录1:datatrac_customer_no: 227, tophat_customer_detail_Id 1

记录2:datatrac_customer_no: 228, tophat_customer_detail_Id: 1

记录3:datatrac_customer_no: 910, tophat_customer_detail_Id: 5

然后对于在 mainPull 中拉取的第一条记录,字段 c.customer_no == 228 所以我需要在 select new 语句中将 th_customerId 替换为 1(来自矩阵中的记录 2。

然后说在mainPull字段中拉下一条记录c.customer_no = 910 th_customerId就是5。

这就是我的 foreach 语句的第一行目前正在做的事情。我想将该逻辑移动到我的 LINQ 查询中。

最佳答案

如果我没理解错的话,在这里使用键为 datatrac_customer_no 且值为 tophat_customer_detail_Id 的字典是个好主意:

var dt_th_matrix = (from m in aDb.Matrix_Datatrac_TopHat select m).ToDictionary(m=>m.datatrac_customer_no,m=>m.tophat_customer_detail_Id);

有了这个你应该能够用

替换你的“查询以某种方式到达这里”
dt_th_matrix[c.Customer_No]

也可以使用 LINQ,但我认为性能开销和可读性降低不值得。

如果您仍想对原始矩阵使用 LINQ,这应该可以作为您的查询:

dt_th_matrix.Single(m => m.datatrac_customer_no == c.Customer_No).tophat_customer_detail_Id

如果 key 多次未找到或存在,这两个表达式都会抛出异常 - 但如果我正确理解您的结构,这应该是不可能的。否则你需要检查这个。

关于c# - 在 LINQ 查询中添加 Lambda 以替换 foreach 中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53868364/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com