根据 LINQ 中的条件更改联接类型

Change Join Type on a condition in LINQ

例如我有这样一个连接:

from cust in customerList 
join prod in productList on cust.ProductId equals prod.Id
join veh in vehicleList on prod.VehicleId equals veh.Id into v
from veh in v.DefaultIfEmpty()
select new {customerName = cust.Name, customerVehicle=veh.VehicleName}

如您所见,第三行和第四行有一个右连接。我想以参数化的方式进行此连接。我的意思是,如果我有一个变量,我想将连接更改为:

string x ="right";

if(x == right) //execute right join
{
    from cust in customerList 
    join prod in productList on cust.ProductId equals prod.Id
    join veh in vehicleList on prod.VehicleId equals veh.Id into v
    from veh in v.DefaultIfEmpty()
    select new {customerName = cust.Name, customerVehicle=veh.VehicleName}
}
else //execute inner join
{
    from cust in customerList 
    join prod in productList on cust.ProductId equals prod.Id
    join veh in vehicleList on prod.VehicleId equals veh.Id 
    select new {customerName = cust.Name, customerVehicle=veh.VehicleName}
}

我可以用 if 语句来做到这一点,但我认为代码太多,重复太多。那么我可以在 join 行中使用三元运算符来应用这个条件吗?提前致谢。

编辑:

正如我所说,我可以按照此 question 中的建议使用 if 语句来完成此操作。但是我的原始代码包含 13 个嵌套连接。因此,为每种可能性编写 ifs 会导致代码非常难看。你能帮我吗?

我认为你能做的最好的事情是在变量中设置查询的公共基础部分,然后根据你的条件添加查询的其余部分。

string x ="right";
var qbase = from cust in customerList 
            join prod in productList on cust.ProductId equals prod.Id;

if(x == "right") { //execute right join
    qbase = from custprod in qbase
            join veh in vehicleList on prod.VehicleId equals veh.Id into v
            from veh in v.DefaultIfEmpty()
            select new {customerName = custprod.Name, customerVehicle=veh.VehicleName};
}
else { //execute inner join
    qbase = from custprod in qbase
            join veh in vehicleList on prod.VehicleId equals veh.Id 
            select new {customerName = custprod.Name, customerVehicle=veh.VehicleName};
}

尝试代码

string x ="right";

var result= (from cust in customerList 
join prod in productList on cust.ProductId equals prod.Id
join veh in vehicleList on prod.VehicleId equals veh.Id into v
from veh in v.DefaultIfEmpty()
select new {customerName = cust.Name,customerVehicle=veh.VehicleName}).ToList();

if(x=="right")
result=result.Where(c=>c.customerVehicle!=null).ToList();

X==right Then Null value Is Removed the result otherwise result default left join