【问题标题】:Join three tables using LINQ使用 LINQ 连接三个表
【发布时间】:2018-11-07 01:54:55
【问题描述】:

如何加入三个表并获得所有值 对于两个表我参考

using(Dataclasscontext DbContext = new Dataclasscontext())
{
   var result = (from t1 in DbContext.tbl1 join t2 in DbContext.tbl2 on t1.id equel t2.id select new {t1.id,t1.name,t2.class,t2.std}).toArray();
}

我参考了三个表

using(Dataclasscontext DbContext = new Dataclasscontext())
{
   var result = (from t1 in DbContext.tbl1 
                 from t2 in DbContext.tbl2 where t1.id1 == t2.id1 
                 from t3 in Db`enter code here`Context.tbl3 where t2.id2 == t3.id2).toArray();
}

但不希望这种类型的查询用于连接三个表。有没有人帮我用 join 加入三个表

【问题讨论】:

  • 你要找的结果是什么样的join?左、右还是内?
  • 怎么样 var result = _dbContext.tbl1.Include("tbl2").Include("tbl2.tbl3").ToList(); ?
  • 这是 EF/LINQ 中最常见的气味之一。试图将 entities 视为表,并将 LINQ 视为 SQL 的替代品。他们不是。在您的 entities 中创建适当的关系和导航属性,EF 将生成连接。您所要做的就是加载 根实体,EF 将加载所有子实体
  • @tzm Include 并不意味着加入。如果尚未定义关系,它将不起作用..它也不需要。如果最终的Select 调用从子类中读取数据,则将生成正确的连接和选择以仅返回必要的数据
  • @MinhajPatel 换句话说,1,2 或 5 张桌子,这并不重要。您可以编写非常相似的查询来检索您想要的数据

标签: c# sql linq join


【解决方案1】:

我不是 100% 确定你想做什么,但我认为你想摆脱“来自”。

这是一个仅使用带有“经典方法”的 Linq 的示例:

// Testclasses which will be joined
public class TestClass1
{
    public int Id { get; set; }
    public string Name1 { get; set; }
}
public class TestClass2
{
    public int Id { get; set; }
    public string Name2 { get; set; }
}

static void Main()
{
    // define some example-data
    List<TestClass1> list1 = new List<TestClass1>()
    {
        new TestClass1() { Id = 1, Name1 = "One1" },
        new TestClass1() { Id = 2, Name1 = "Two1" },
        new TestClass1() { Id = 3, Name1 = "Three1" }
    };
    List<TestClass2> list2 = new List<TestClass2>()
    {
        new TestClass2() { Id = 1, Name2 = "One2" },
        new TestClass2() { Id = 2, Name2 = "Two2" },
        new TestClass2() { Id = 3, Name2 = "Three2" }
    };

    // Here the 'magic' happens:
    // We perform a join one our 1st list
    // We send list2 as list to join with
    // We define two key-selectors in lambda-expressions: t1 => t1.Id and t2 => t2.Id
    // We form the joined object as anonymous type: (t1, t2) => new { Id = t1.Id, Name1 = t1.Name1, Name2 = t2.Name2}
    var joinedList = list1.Join(
        list2,
        t1 => t1.Id,
        t2 => t2.Id,
        (t1, t2) => new { Id = t1.Id, Name1 = t1.Name1, Name2 = t2.Name2 }
        );

    foreach (var item in joinedList)
    {
        Console.WriteLine("Id: {0}, Name1: {1}, Name2: {2}", item.Id, item.Name1, item.Name2);
    }
}

【讨论】:

  • 这是一个 EF 问题。即使使用 LINQ to Objects,尽管使用连接也是一个坏主意。代替平面列表,向实体添加适当的属性和集合。无需加入,只需导航到子实体
  • @PanagiotisKanavos 完全正确,但这不是问题所在。在他的例子中,他形成了一个匿名对象new {t1.id,t1.name,t2.class,t2.std},因此我不得不认为他想加入。
  • 不,你没有。事实上,在TestClass1 类中创建一个指向TestClass2Item2 属性并在Select() 调用中使用Name2=t1.Items.Name 是很简单的。无需加入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多