2017-05-11 4 views
0

で条件に種類に参加:変更は、私は、このような参加持っ例えば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} 

あなたは右がある見ることができるように3行目と4行目に参加。私は、この結合をパラメータ化された方法で行いたいと思っています。

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行内の三項演算子を使ってこの条件を適用できますか?前もって感謝します。

EDIT:

私はこのquestionで示唆されているように、私はif文でこれを行うことができます言ったように。しかし、私の元のコードには13のネストされた結合が含まれています。あらゆる可能性についてifsを書くと、非常に醜いコードになるでしょう。それで私を助けてくれますか?

+1

可能な重複に参加左.com/questions/7767847/conditional-join-in-linq) –

+0

これは本当に数十回前に尋ねられています。あなたは質問を投稿する前にgoogleしましたか? –

+0

@CamiloTerevintoはい私はグーグルで、私は前にそのページを見ました。しかし、これは私の質問に答えるものではありません。私は本当に答えを見ることができませんでした。 – jason

答えて

1

のtryコード

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 ==右次にnull値が結果除去されるそうでない場合は、デフォルトの結果は、(HTTP [条件付きLINQに参加]の

+0

ありがとうございます。 Xを残してもnull値を削除してはいけませんか?ありがとう。 – jason

+0

はい、テストは元の問題のために後ろ向きです。 – NetMage

1

あなたができることは、クエリの共通基底部分を変数に設定し、条件に基づいて残りのクエリを追加することです。 // stackoverflowの:

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}; 
} 
関連する問題