【问题标题】:Querying 2 datatables in a dataset查询数据集中的 2 个数据表
【发布时间】:2013-04-11 10:06:35
【问题描述】:

我有 2 个名为“dst”和“dst2”的数据表。它们位于数据集“urenmat”中。 数据的主体在“dst”中。然而,这包含一个名为“werknemer”的列。它包含一个对应于“dst2”中某一行的值。此列名为“数字”。

我需要一种将 dst.werknemer 和 dst2.nummer 链接的数据表的左外连接方法,并创建一个新的数据表,其中包含链接到“dst.werknemer”的“dst2.naam”以及所有'dst' 中的其他列。

我到处寻找,但似乎仍然找不到我的问题的正确答案。几个站点提供了一种在这种情况下使用 LINQ 的方法。我曾尝试使用 LINQ,但我对此并不那么熟练。

我尝试使用 101 个 LINQ 示例: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

urenmat = dataset.
dst =  a, b, c, d, werknemer.
dst2 = nummer, naam.

我使用了“101”中的以下代码。

            var query =
            from contact in dst.AsEnumerable()
            join order in dst2.AsEnumerable()
            on contact.Field<string>("werknemer") equals
            order.Field<string>("nummer")
            select new
            {
                a = order.Field<string>("a"),
                b = order.Field<string>("b"),
                c = order.Field<string>("c"),
                d = order.Field<string>("d"),
                naam = contact.Field<decimal>("naam")};

但是,我不知道将“联系人”和“订单”更改为什么,而且我似乎无法找到如何再次将其保存到数据表中。

如果这些是愚蠢的问题,我很抱歉,但我试图自己解决它,但看起来我很愚蠢:P。提前感谢您的帮助!

附言。我正在使用 C# 进行编码,数据集和数据表是类型化的。

【问题讨论】:

    标签: c# linq datatable dataset


    【解决方案1】:

    如果您想生成dst 左外连接到dst2 的投影数据集,您可以使用此 LINQ 表达式(抱歉,我并不真正使用 LINQ 查询语法,因此您必须使用此 lambda 语法而是)。

    var query = dst.AsEnumerable()
        .GroupJoin(dst2.AsEnumerable(), x => x.Field<string>("werknemer"), x => x.Field<string>("nummer"), (contact, orders) => new { contact, orders })
        .SelectMany(x => x.orders.DefaultIfEmpty(), (x, order) => new
        {
            a = order.Field<string>("a"),
            b = order.Field<string>("b"),
            c = order.Field<string>("c"),
            d = order.Field<string>("d"),
            naam = x.contact.Field<decimal>("naam")
        });
    

    因为这是一个投影数据集,您不能简单地保存回数据表。如果需要保存,那么您需要加载受影响的行,更新所需的字段,然后保存更改。

    // untyped
    var row = dst.Rows.Find(keyValue);
    // typed
    var row = dst.FindBy...(keyValue);
    
    // update the field
    row.SetField("a", "some value");
    // save only this row's changes
    row.AcceptChanges();
    
    // or after all changes to the table have been made, save the table
    dst.AcceptChanges();
    

    通常,如果您需要执行(投影)数据的加载和保存,ORM(如实体框架或 LINQ-to-SQL)将是最好的工具。但是,在这种情况下,您使用的是 DataTable,我不确定您是否可以将 ORM 链接到这些(尽管看起来可能是可能的)。

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多