C# 是否可以使用Linq在Sql和DataTable之间编写连接?
我有一个基于时间戳从多个数据库MySql中提取客户信息的过程。我将这些数据存储到数据表中。数据表表示对现有客户信息以及新客户信息的更新 我想基于一个常量值CompanyID和CustomerID删除目标数据库SqlServer中的任何重复。因此,我认为join会给我目标数据库中复制的recordid,将列表或一些收集机制传递给DELETE方法 我所拥有的: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
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