Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Table Join in Linq C# Dynamically

Tags:

c#

sql

linq

I have 3 data tables: a; b; and c. In this I need to write Join Query Dynamically using LINQ.

The Selecting columns given by customer and Condition columns also given customer at run time.

So I need to create queries dynamically. Please check below example. Because I don't know which table they want and which column also

For example

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

Like I need create different set of queries. Please help me on this.

like image 451
kmkperumal Avatar asked Oct 27 '25 03:10

kmkperumal


1 Answers

You could use either System.Linq.Dynamic(ScottGu's blog article and nuget) in case of dynamic where clause:

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");

Or dynamicaly build expressions this using extensions from PredicateBuilder writen by @joe-albahari. For example:

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: full code available at gisthub

like image 85
Akim Avatar answered Oct 28 '25 18:10

Akim