C# 使用标志列的Linq联接表

C# 使用标志列的Linq联接表,c#,winforms,linq,datatable,.net-3.5,C#,Winforms,Linq,Datatable,.net 3.5,我需要使用一个名为cashbillingtype_id的列标志连接3个表,这决定了要连接的表 例如,我有一个名为[CashBillings]的数据表: cashbilling_id cashbillingtype_id 1 1 2 1 3 2 当: 现在每个表Bills、Returns、Cancellations都有一个名为cashbillingBRC_total的列,我需要根据标志main datatabl

我需要使用一个名为cashbillingtype_id的列标志连接3个表,这决定了要连接的表

例如,我有一个名为[CashBillings]的数据表:

cashbilling_id  cashbillingtype_id
1               1
2               1
3               2
当:

现在每个表Bills、Returns、Cancellations都有一个名为cashbillingBRC_total的列,我需要根据标志main datatable获取该列数据

我试着:

(from CashBillings in _DataTable_Billings.AsEnumerable()
                                  join CashBillingsTypes in _DataTable_BillingsTypes.AsEnumerable()
                                      on CashBillings.Field<Int32>("cashbillingtype_id") equals CashBillingsTypes.Field<Int32>("cashbillingtype_id")
                                  select new
                 {
                     cashbilling_id = CashBillings.Field<Int32>("cashbilling_id"),
                     cashbillingBRC_total = (CashBillingsTypes.Field<Int32>("cashbillingtype_id") == 1 ?
                                                   (from CashBillingsBills in _DataTable_BillingsBills.AsEnumerable()
                                                    where CashBillingsBills.Field<Int32>("cashbilling_id") == CashBillings.Field<Int32>("cashbilling_id")
                                                    select CashBillingsBills.Field<Double>("cashbillingbill_total")).LastOrDefault()
                                                   :
                                                   (CashBillingsTypes.Field<Int32>("cashbillingtype_id") == 2 ?
                                                   (from CashBillingsReturns in _DataTable_BillingsReturns.AsEnumerable()
                                                    where CashBillingsReturns.Field<Int32>("cashbilling_id") == CashBillings.Field<Int32>("cashbilling_id")
                                                    where CashBillingsReturns.Field<Int32>("cashbillingreturnstatus_id") == 1 // Only Processed 
                                                    select CashBillingsReturns.Field<Double>("cashbillingreturn_total")).LastOrDefault()
                                                   :
                                                   (from CashBillingsCancellations in _DataTable_BillingsCancellations.AsEnumerable()
                                                    where CashBillingsCancellations.Field<Int32>("cashbilling_id") == CashBillings.Field<Int32>("cashbilling_id")
                                                    select CashBillingsCancellations.Field<Double>("cashbillingcancellation_total")).LastOrDefault())
                                                ),
                 }).Aggregate(DataTable_Billings, (dt, result) => { dt.Rows.Add(result.cashbilling_id, 
                                                                                result.cashbillingtype_id,
                                                                                result.cashbillingtype_name,
                                                                                result.cashbillingBRCstatus_id,
                                                                                result.cashbillingBRCstatus_name,
                                                                                result.cashbillingcustomer_fullname,
                                                                                result.cellar_name,
                                                                                result.cashbillingBRC_subtotal,
                                                                                result.cashbillingBRC_discount,
                                                                                result.cashbillingBRC_isv,
                                                                                result.cashbillingBRC_total,
                                                                                result.cashbillingBRC_date); return dt;
                 });

但这段代码的效率非常低。

您能用left检查一下吗?首先连接所有表,然后只对select语句中的字段进行操作? 如果需要有关左联接的信息,请参阅

(from CashBillings in _DataTable_Billings.AsEnumerable()
                                  join CashBillingsTypes in _DataTable_BillingsTypes.AsEnumerable()
                                      on CashBillings.Field<Int32>("cashbillingtype_id") equals CashBillingsTypes.Field<Int32>("cashbillingtype_id")
                                  select new
                 {
                     cashbilling_id = CashBillings.Field<Int32>("cashbilling_id"),
                     cashbillingBRC_total = (CashBillingsTypes.Field<Int32>("cashbillingtype_id") == 1 ?
                                                   (from CashBillingsBills in _DataTable_BillingsBills.AsEnumerable()
                                                    where CashBillingsBills.Field<Int32>("cashbilling_id") == CashBillings.Field<Int32>("cashbilling_id")
                                                    select CashBillingsBills.Field<Double>("cashbillingbill_total")).LastOrDefault()
                                                   :
                                                   (CashBillingsTypes.Field<Int32>("cashbillingtype_id") == 2 ?
                                                   (from CashBillingsReturns in _DataTable_BillingsReturns.AsEnumerable()
                                                    where CashBillingsReturns.Field<Int32>("cashbilling_id") == CashBillings.Field<Int32>("cashbilling_id")
                                                    where CashBillingsReturns.Field<Int32>("cashbillingreturnstatus_id") == 1 // Only Processed 
                                                    select CashBillingsReturns.Field<Double>("cashbillingreturn_total")).LastOrDefault()
                                                   :
                                                   (from CashBillingsCancellations in _DataTable_BillingsCancellations.AsEnumerable()
                                                    where CashBillingsCancellations.Field<Int32>("cashbilling_id") == CashBillings.Field<Int32>("cashbilling_id")
                                                    select CashBillingsCancellations.Field<Double>("cashbillingcancellation_total")).LastOrDefault())
                                                ),
                 }).Aggregate(DataTable_Billings, (dt, result) => { dt.Rows.Add(result.cashbilling_id, 
                                                                                result.cashbillingtype_id,
                                                                                result.cashbillingtype_name,
                                                                                result.cashbillingBRCstatus_id,
                                                                                result.cashbillingBRCstatus_name,
                                                                                result.cashbillingcustomer_fullname,
                                                                                result.cellar_name,
                                                                                result.cashbillingBRC_subtotal,
                                                                                result.cashbillingBRC_discount,
                                                                                result.cashbillingBRC_isv,
                                                                                result.cashbillingBRC_total,
                                                                                result.cashbillingBRC_date); return dt;
                 });