【问题标题】:C# Linq join 2 TablesC# Linq 加入 2 个表
【发布时间】:2012-09-11 14:00:27
【问题描述】:

我想用 linq 或 DataRelation 加入 2 个表。所以我首先尝试了 linq,效果很好,但是当我将另一个对象添加到 1.Tables 并加入 2.Table 时,它​​不会显示这个对象。

这是我的代码:

DataTable table = new DataTable("Kunde");

table.Columns.Add("KundeID", typeof(Int32));
table.Columns.Add("KundeName", typeof(String));
table.Columns.Add("Produkt", typeof(String));

table.PrimaryKey = new DataColumn[] { table.Columns["KundeID"] };

DataTable comment = new DataTable("Comment"); 

comment.Columns.Add("KundeName", typeof(String));
comment.Columns.Add("Comment", typeof(String));

comment.PrimaryKey = new DataColumn[] { comment.Columns["KundeName"] };


DataSet ds = new DataSet("DataSet");

ds.Tables.Add(table);
ds.Tables.Add(comment);

object[] o1 = { 1, "Michael", "Jogurt" };
object[] o2 = { 2, "Raj", "Cola" };
object[] o3 = { 3, "Gary", "Fanta" };
***object[] o4 = { 4, "Miky", "Sprite" };***

object[] c1 = { "Raj", "Ich bin cool" };
object[] c2 = { "Gary", "yahoo" };
object[] c3 = { "Michael", "nichts zu verlieren" };


table.Rows.Add(o1);
table.Rows.Add(o2);
table.Rows.Add(o3);
table.Rows.Add(o4);

comment.Rows.Add(c1);
comment.Rows.Add(c2);
comment.Rows.Add(c3);

var results = from table1 in table.AsEnumerable()
              join table2 in comment.AsEnumerable()
              on table1.Field<string>("KundeName") equals table2.Field<string>("KundeName")
              select new
                  {
                      KundeID = table1.Field<Int32?>("KundeID"),
                      KundeName = table1.Field<String>("KundeName"),
                      Produkt = table1.Field<String>("Produkt"),

                      Comment = table2.Field<String>("Comment")
                  };

foreach (var item in results)
{
    Console.WriteLine(String.Format("{0}    {1}    {2}    {3}", item.KundeID, item.KundeName, item.Produkt, item.Comment));
}


Console.ReadKey();

【问题讨论】:

    标签: c# linq join dataset


    【解决方案1】:

    如果您需要第一个表中的所有行,无论它们是否可以连接到第二个表中的行,您都需要左连接:

        var results = from table1 in table.AsEnumerable()
                      join table2 in comment.AsEnumerable()
                      on table1.Field<string>("KundeName") equals table2.Field<string>("KundeName") into joined
                      from table3 in joined.DefaultIfEmpty()
                      select new
                          {
                              KundeID = table1.Field<Int32?>("KundeID"),
                              KundeName = table1.Field<String>("KundeName"),
                              Produkt = table1.Field<String>("Produkt"),
    
                              Comment = table3 != null ? table3.Field<String>("Comment") : null
                          };
    

    这样您可以获得名为“Miky”的客户,但他的 Comment 将为空。

    【讨论】:

    • 左连接是正确的。非常感谢。效果很好!!!当我有 3.Table 并想加入 1. 和 2. Tables 时,会不会是一样的原理?
    • 很高兴为您提供帮助,如果您认为答案最有帮助,您可以将其标记为正确...欢迎使用 Stackoverflow :)
    • @UniLe 这取决于您希望实现的目标,您应该发布第三个表的一些示例数据以及所需的输出。您应该先自己尝试一下,如果您在使用它时遇到问题,请提出一个新问题。
    • 太棒了 :) 左连接(在 LINQ 或 SQL 中)不会减少/过滤结果集,它们从“左”表中获取所有内容,如果某些行在右表,它们只是将右表的字段显示为空(不删除行或影响左表中的字段)。
    【解决方案2】:

    您的o4 对象在comment 中没有具有匹配KundeName 值的对象,因此它不包含在结果中。

    也许您不是要使用内连接?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多