简体   繁体   中英

LINQ - Left Join converting RIGHT results to List

I'm struggling to find the correct combination of LINQ Methods to perform a multi-table left join with a one to many mapping that makes a list along with the grouped results.

Current Status I have a Plan table, joined with other tables to get the columns I need to get my list of plans.

var plans = await (
                        from ubp in db.ViewUserBusinessPlan
                        join bp in db.ViewBusinessPlan on ubp.BusinessPlanId equals bp.BusinessPlanId
                        where bp.BusinessId == businessId
                        select new
                        {
                            ubp.UserBusinessPlanId,
                            ubp.BusinessPlanId,
                            bp.Name,
                            bp.PlanGroup,
                            bp.BusinessId,
                            ubp.BusinessLocationId,
                            ubp.StripeSubscriptionId,
                            ubp.UserId,
                            ubp.BusinessPlanPriceCents
                        }

Problem: Now I need to ultimately get the applicable Tax Rates that are associated with those Plans. This is stored in 2 tables.

  1. UserBusinessPlanTaxRates - (a mapping table) that contains UserBusinessPlanId and TaxRateId.
  2. TaxRates - TaxRate Information with TaxRateId as PK

Some plans have tax rates, some do not, so need a LEFT JOIN type scenario. Also, some plans can have multiple tax rates so I need a list of TaxRates. I've tried various Group methods, subqueries, and left joins. But nothing seems to put them all together.

I want to get all plans, with a list of TaxRates.

You can add a sub-query in the select to do the necessary join:

TaxRates = db.UserBusinessPlanTaxRates.Where(ubptr => ubptr.UserBusinessPlanId == ubp.UserBusinessPlanId)
                                      .GroupJoin(db.TaxRates, ubptr => ubptr.TaxRateId, tr => tr.TaxRateId, (ubptr, trj) => trj)
                                      .SelectMany(trj => trj)
                                      .ToList()

Whether it will translate properly (or optimally) to SQL depends on what LINQ to database you are using.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM