Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据LINQ中的条件更改联接类型_C#_Linq_Join_Ternary Operator - Fatal编程技术网

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

C# 根据LINQ中的条件更改联接类型,c#,linq,join,ternary-operator,C#,Linq,Join,Ternary Operator,例如,我有这样一个连接: 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.

例如,我有这样一个连接:

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
语句来实现这一点,但我认为代码太多,重复太多。所以我可以在
连接
行中使用三元运算符应用这个条件吗?提前谢谢

编辑:


正如我所说,我可以用本文中建议的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 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==右然后删除空值结果否则结果默认左连接

尝试代码

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==右然后删除空值结果否则结果默认左连接

此操作的可能重复以前确实被询问过几十次。在发布这个问题之前,你甚至用谷歌搜索过吗?@CamiloTerevinto是的,我用谷歌搜索过,我以前看过这个页面。但这并不能回答我的问题。我真的看不出答案。@Camiloteriento我已经在我的问题中提到了那个问题的公认答案。我在找其他的东西。这可能是重复的真的被问了几十次了。在发布这个问题之前,你甚至用谷歌搜索过吗?@CamiloTerevinto是的,我用谷歌搜索过,我以前看过这个页面。但这并不能回答我的问题。我真的看不出答案。@Camiloteriento我已经在我的问题中提到了那个问题的公认答案。我在找别的东西。谢谢你的回答。当X离开时,我不应该删除空值吗?谢谢。是的,你原来的问题的测试是反向的。谢谢你的回答。当X离开时,我不应该删除空值吗?谢谢。是的,对于你原来的问题,测试是反向的。