如何在LINQ中将一个数据库的记录插入另一个数据库

时间:2015-02-10 09:22:51

标签: c# linq

我有2个带表格的数据库。

我想将第一个数据库中的记录插入LINQ中的第二个数据库表。我创建了2个带有2个datacontexts的dbml文件,但我无法对记录的插入进行编码。

我有记录列表:

using(_TimeClockDataContext)
{
    var Query = (from EditTime in _TimeClockDataContext.tblEditTimes
                 orderby EditTime.ScanDate ascending
                 select new EditTimeBO
                 {
                     EditTimeID = EditTime.EditTimeID,
                     UserID = Convert.ToInt64(EditTime.UserID),
                     ScanCardId = Convert.ToInt64(EditTime.ScanCardId),
                 }).ToList();
    return Query;
}

现在我想在_Premire2DataContext中的新表中插入记录。

1 个答案:

答案 0 :(得分:0)

如果您想使用Linq将记录从一个数据库“复制”到另一个数据库,那么您需要两个数据库上下文,一个用于您正在读取的数据库,另一个用于您正在读取的数据库。

EditTime[] sourceRows;
using (var sourceContext = CreateSourceContext())
{
    sourceRows = ReadRows(sourceContext);
}

using (var destinationContext = CreateDestinationContext())
{
    WriteRows(destinationContext, sourceRows);
}

您现在只需要使用标准的LINQ to SQL代码填写ReadRowsWriteRows的实现。写行的代码应该看起来像这样。

void WriteRows(TimeClockDataContext context, EditTime[] rows)
{
    foreach (var row in rows)
    {
        destinationContext.tblEditTimes.Add(row);
    }
    destinationContext.SubmitChanges();
}

请注意,只要架构相同,您就可以使用相同的上下文,因此使用相同的对象 - 因此在读取记录时,我们理想地希望返回正确的数组类型,因此读取看起来有点像这样< / p>

EditTime[] ReadRows(TimeClockDataContext context)
{
    return (
        from EditTime in _TimeClockDataContext.tblEditTimes
        orderby EditTime.ScanDate ascending
        select EditTime
     ).ToArray();
}

您可以使用数组或列表 - 这并不重要。我使用的数组主要是因为语法较短。请注意,我们返回原始EditTime对象而不是创建新对象,因为这意味着我们可以将这些对象直接添加到第二个数据上下文中。

我还没有编译任何此代码,因此它可能包含一些拼写错误。如果我犯了一些明显的错误,也会道歉 - 自从我上次使用LINQ to SQL以来已经有一段时间了。

如果您有外键或第二个数据库有不同的架构,那么事情变得更复杂,但基本过程保持不变 - 从一个上下文(使用标准LINQ到SQL)读取并将结果存储在某处,然后添加行第二个上下文(使用标准LINQ to SQL)。

另请注意,这不一定特别快。如果性能是一个问题,那么您应该考虑在WriteRows方法中使用批量插入,或者甚至可能使用链接服务器在SQL中执行整个操作。