动态使用Linq C#进行多表连接

4

我有3个数据表: abc。我需要使用LINQ动态地编写连接查询。

客户会在运行时给出要选择的列和条件列。

因此,我需要动态创建查询语句。请查看以下示例。因为我不知道他们想要哪个表格和哪个列。

例如:

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

我需要创建不同的查询集,请帮助我。


我可以编写静态查询,如下所示:var query = from aa in a join bb in b on aa.c1 equals bb.c1 select new { aa.Name, bb.Product }; 但是我想根据表和列动态编写上述查询,这只是我不知道如何做,请帮助我。 - kmkperumal
1
@kmkperumal,a、b和c是糟糕的示例,使得阅读变得非常困难...你能否用真实的名称来举例,即使它们很愚蠢?看看akim提供的水果和汽车示例。 - ANeves
你是如何解决这种情况的?我面临着相同的情境。 - Ameerudheen.K
1个回答

3

在动态 where 子句的情况下,您可以使用 System.Linq.Dynamic (ScottGu 的博客文章nuget):

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

或者使用由 @joe-albahari 编写的 PredicateBuilder 扩展 动态构建表达式。例如:

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

注:完整代码请访问GistHub

这段文字是关于IT技术的内容。

2
这并没有进行“动态连接”。 fruit.ID 等于 car.ID 是硬编码的,无法在运行时更改。 - Igor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接