我有两个名为'dst'和'dst2'的数据表。它们位于数据集'urenmat'中。 数据的可能性在'dst'中。但是这包含一个名为'werknemer'的列。它包含一个对应于'dst2'中某一行的值。此列名为“nummer”。
我需要的是一种左外连接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。提前感谢您的帮助!
PS。我使用C#代码,输入数据集和数据表。
答案 0 :(得分:0)
如果你想生成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链接到这些(尽管看起来似乎有可能)。