【问题标题】:Multiple Table Join in Linq C# DynamicallyLinq C#中的多表动态连接
【发布时间】:2012-12-17 17:00:37
【问题描述】:

我有3个数据表:ab;和c。在此我需要使用 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 a b 和 c 是可怕的例子,很难阅读......你不能用真实的名字做一个例子,即使他们很傻?请参阅 akim 的水果和汽车示例。
  • 您是如何解决这种情况的?我面临同样的情况

标签: c# sql linq


【解决方案1】:

在动态 where 子句的情况下,您可以使用 System.Linq.Dynamic(ScottGu'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");

或者使用@joe-albahari 编写的extensions from 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();

ps:完整代码可在gisthub获取

【讨论】:

  • 这不会进行“动态连接”。 fruit.ID 等于 car.ID 是硬编码的,在运行时无法更改。
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多