【问题标题】:linq between two datatables两个数据表之间的 linq
【发布时间】:2014-05-05 19:14:00
【问题描述】:

我有两个未链接的 sql server 实例,DBA 不会链接它们。 数据库 1 在实例 1 上,数据库 2 在实例 2 上

在数据库 1 中是一个文档表。该表在数据库 2 上不存在。

我有以下查询可以在数据库 1 上正常运行:

    select name, modify_date from sys.objects where type = '@type' and modifydate >= '@date' and not exists (select column from documentationtable where name = sys.objects.name and inserteddate > sys.objects.modifydate and objecttype = @objecttype) order by modify_date

我现在将此查询拆分为两个单独的查询。

    select name, modify_date from sys.objects where type = @type and modifydate >= @modifydate order by modify_date

    select column from documentationtable where name in (@CompareString)

上述两个查询中的每一个都填充两个单独的数据表。我正在尝试模拟 linq 中的第一个查询或其他方式以获取返回的正确信息,但到目前为止我还没有取得任何成功。

谨记:我无法修改数据库。我无法链接这两个实例(否则这不是问题)。

还有人有其他想法吗?

这样做的目的是返回数据库中已修改的项目列表,以记录它们为何被修改以保持 ISO 合规性。我正在使用 3.5 框架在 VB.Net 中工作。

【问题讨论】:

  • 你需要使用数据表吗?您可以将两组数据加载到一个更简单的数据结构中——List(Of AnonymousType)——并将它们组合在一起。
  • 我有模糊的回忆,您必须先将 DataTables 转换为 DataSets。
  • 我不必使用数据表。我可以把它转换成任何东西。 “不存在于(选择...)中”现在让我陷入循环。
  • 请在没有水平滚动条的情况下格式化。还要明确两个单独查询中的哪一个在哪里运行(我认为分别是 bb2 和 db1)。

标签: sql vb.net linq


【解决方案1】:

这是我不久前写的。这不是生产代码,只是在搞乱。

DataTable dataTable1 = new DataTable();
dataTable1.Columns.Add("id", typeof(int));
dataTable1.Columns.Add("text", typeof(string));
dataTable1.Rows.Add(1,"one");

DataTable dataTable2 = new DataTable();
dataTable2.Columns.Add("id", typeof(int));
dataTable2.Columns.Add("text", typeof(string));
dataTable2.Rows.Add(1, "fred");

List<testType> joinedData = (
                from dataRow2 in dataTable2.AsEnumerable()
                join dataRow1 in dataTable1.AsEnumerable()
                 on (int)dataRow2["id"] equals (int)dataRow1["id"]
                select new testType()
                {
                    Col1 = (int)dataRow1["id"],
                    Col2 = (string)dataRow2["text"]
                }).ToList();

foreach (testType item in joinedData)
{
    Console.WriteLine("hello - " + item.Col1.ToString() + " --- " + item.Col2 );
}

它有效。我在控制台中看到了预期的结果。它可能会给你一些想法。

【讨论】:

  • 我实际上相信这样的事情会奏效。问题是,如何获取数据表 1 中列出但数据表 2 中不存在的项目?
  • @Bigdaddyduergar Enumerables 有一个 except 方法,它接受另一个 Enumerable 并只留下不匹配的成员。
【解决方案2】:

我是这样弄明白的:

我根据类型从系统表中加载了所有对象。 从那里我创建了一个存储过程来查看我们存储数据的表。如果返回了一个对象,这意味着它已经使用我指定的参数存在于表中,并且我不想保存它,因此我转到 sys.objects 数据表中加载的下一项。

从那里,我能够确定需要什么,不需要什么。

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多