2012-12-17 116 views
2

我有3個數據表:a; b;和c。在此我需要使用LINQ動態編寫聯接查詢。多表加入Linq C#動態

客戶和條件列給出的選擇列也在運行時給予客戶。

所以我需要動態地創建查詢。請檢查下面的例子。因爲我不知道他們要和列還

例如

Select a.c1,a.c2,b.c1,b.c2 From a Left Join b on a.c1=b.c1 

Select c.c1,c.c2,a.c1,a.c2 From c Left Join a on c.c3=a.c1 

Select a.c1,a.c2,b.c1,b.c2,c.c1,c.c2 From a Left Join b on a.c2=b.c2 Left join c on c.c1=a.c1 

的表像,我需要創建不同的查詢集合。請幫助我。

+0

我可以在 \t \t寫靜態查詢類似下面的VAR的查詢=從AA加入BB在B上aa.c1等於bb.c1 \t \t選擇新{aa.Name,bb.Product};但我想要的是動態地寫上面的查詢基於表和列,只有我不知道該怎麼做。請幫助我。 – kmkperumal

+1

@kmkperumal a b和c是可怕的例子,使它真的很難閱讀......難道你不能用真實姓名做一個例子,即使它們很傻嗎? akim看水果和汽車的例子。 – ANeves

回答

4

你可以在動態where子句中的情況下請使用System.Linq.DynamicScottGu's blog articlenuget):

var results = (from fruit in fruits 
    join car in cars on fruit.Id equals car.Id 
    select new { fruit, car }) 
    .AsQueryable() 
    .Where("fruit.ColA != car.ColA") 
    .Where("fruit.ColB == car.ColB"); 

或者dynamicaly建立這個使用extensions from PredicateBuilder通過@喬 - 阿爾巴哈利writen表達式。例如:

var predicate = 
    PredicateBuilder 
     .True<Tuple<Product, Product>>() 
     .And(t => t.Item1.ColA != t.Item2.ColA) 
     .And(t => t.Item1.ColB == t.Item2.ColB) 
     .Compile();  

(from fruit in fruits 
    join car in cars on fruit.Id equals car.Id 
    select Tuple.Create(fruit, car)) 
    .Where(predicate) 
    .Dump(); 

PS:提供完整的代碼在gisthub

+2

這不會做「動態連接」。 fruit.ID等於car.ID是硬編碼的,不能在運行時更改。 – Igor