C# 是否可以使用Linq在Sql和DataTable之间编写连接?

C# 是否可以使用Linq在Sql和DataTable之间编写连接?,c#,linq-to-sql,.net-3.5,datatable,linq-to-objects,C#,Linq To Sql,.net 3.5,Datatable,Linq To Objects,我有一个基于时间戳从多个数据库MySql中提取客户信息的过程。我将这些数据存储到数据表中。数据表表示对现有客户信息以及新客户信息的更新 我想基于一个常量值CompanyID和CustomerID删除目标数据库SqlServer中的任何重复。因此,我认为join会给我目标数据库中复制的recordid,将列表或一些收集机制传递给DELETE方法 我所拥有的: using (var context = new DataContext(SqlConnection)) { var tblSour

我有一个基于时间戳从多个数据库MySql中提取客户信息的过程。我将这些数据存储到数据表中。数据表表示对现有客户信息以及新客户信息的更新

我想基于一个常量值CompanyID和CustomerID删除目标数据库SqlServer中的任何重复。因此,我认为join会给我目标数据库中复制的recordid,将列表或一些收集机制传递给DELETE方法

我所拥有的:

using (var context = new DataContext(SqlConnection))
{
    var tblSource = context.GetTable<tblCustomerInfo>();
    var dupeIDs = from currCust in tblSource
                  join newCust in myTable.AsEnumerable() on currCust.CompanyID equals newCust.Field<string>("CompanyID")
                  where currCust.CustomerID.Equals(newCust.Field<int>("CustomerID")
                  select currCust.RecordID;
}
所有这些都将进入一个数据库:

Destination DB  
CompanyID    CustomerID    Field1    Field2    ....   
   1              5          ...       ...  
   1              15         ...       ...    
   1              27         ...       ... 
   5              15         ...       ... 
   10             125        ...       ...
   10             145        ...       ... 
   11             100        ...       ...
因此,在本例中,我将从目标表中删除与表1和表2匹配的项。目标数据库将不断增长,因此创建CustomerID列表似乎不可行。然而,我预计每天导入的新的和更新的客户信息相对较少,有数百条,可能接近1000条记录

如果我无法编写一个连接,那么完成此过程的其他方法是否合适?我正试图弄明白一些事情,因为看起来我实际上无法将Linq与Sql和Linq与对象混合使用

是否可以以某种方式将我的数据表映射到实体datamap,tbl_CustomerInfo,填充一个不可变的变量,然后执行连接

使现代化 以下是我在这一点上所取得的成就,我从dupes中得到了预期的结果:


我现在的问题是,DeleteOnSubmit中包含了什么。。。?我觉得我离这太近了,结果却被这一点挫败了。

或者,您可以创建两个列表,其中包含来自两个源的id,然后使用Intersect LINQ操作符查找公共项

List<int> a = new List<int>{1,2,3,4,5,6,8, 10};
List<int> b = new List<int>{1,2,99,5,6,8, 10};
var c= a.Intersect(b);  //returns the items common to both lists

以下是我的作品:

using (DataContext context = new DataContext(SqlConnection)
{
    var custInfo = context.GetTable<tbl_CustomerInfo>();

    string compID = ImportCust.Rows[0]["CompanyID"].ToString();

    var imports = from cust in ImportCust.AsEnumerable()
                  select cust.Field<int>("CustomerID");

    var dupes = from import in imports
                join cust in custInfo
                on import equals cust.CustomerID 
                where cust.CompanyID== pivnum
                select cust;

    var records = dupes.GetEnumerator();

    while (records.MoveNext())
    { custInfo.DeleteOnSubmit(records.Current); }

    context.SubmitChanges();
}

如果有更有效的方法,我对选项感兴趣。

为了提高效率,我通常在存储过程中处理所有这些问题

将标识字段添加到目标表以唯一标识记录,然后使用如下查询:

DELETE d
FROM DestinationTable d JOIN (
   Select CompanyID, CustomerID, Min(UniqueID) AS FirstRecID
    FROM DestinationTable
    GROUP BY CompanyID, CustomerID) u on u.CompanyID=d.CompanyID AND u.CustomerID=d.CustomerID
WHERE d.UniqueID <> u.FirstRecID

在与我的经理进行了一次简短的show&tell之后,他正在编写一个存储过程来处理这个负载。我将把所有记录批量复制到一个临时表中,然后运行SP。昨晚我还在想,在准备下一组要处理的数据时,我甚至可以运行BulkCopy和SP async。
using (DataContext context = new DataContext(SqlConnection)
{
    var custInfo = context.GetTable<tbl_CustomerInfo>();

    string compID = ImportCust.Rows[0]["CompanyID"].ToString();

    var imports = from cust in ImportCust.AsEnumerable()
                  select cust.Field<int>("CustomerID");

    var dupes = from import in imports
                join cust in custInfo
                on import equals cust.CustomerID 
                where cust.CompanyID== pivnum
                select cust;

    var records = dupes.GetEnumerator();

    while (records.MoveNext())
    { custInfo.DeleteOnSubmit(records.Current); }

    context.SubmitChanges();
}
DELETE d
FROM DestinationTable d JOIN (
   Select CompanyID, CustomerID, Min(UniqueID) AS FirstRecID
    FROM DestinationTable
    GROUP BY CompanyID, CustomerID) u on u.CompanyID=d.CompanyID AND u.CustomerID=d.CustomerID
WHERE d.UniqueID <> u.FirstRecID