根据 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
例如我有这样一个连接:
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