我有困惑
情境:
我想创建一个DataTable的副本,以便添加到另一个DataSet中。有两种方法(AFAIK):
1. Make a Copy using DataTable.Copy()
2. Make a Deep Clone using
public static T DeepClone<T>(this T source)
{
if (!typeof(T).IsSerializable)
throw new ArgumentException("The type must be serializable.", "source");
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
return default(T);
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
我的困惑:
DataTable.Copy()
内部使用DeepClone
还是其他一些
逻辑?答案 0 :(得分:3)
除非我遗漏了一些微不足道的东西,为什么你不能做像
这样的事情DataSet source = GetMySourceDataSet();
DataSet destination = new DataSet();
DataTable orders = source.Tables["SalesOrderHeader"];
// Query the SalesOrderHeader table for orders placed
// after August 8, 2001.
IEnumerable<DataRow> query =
from order in orders.AsEnumerable()
where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
select order;
// Create a table from the query.
DataTable modifiedOrders = query.IsAny() ? query.CopyToDataTable<DataRow>() : new DataTable();
destination.Tables.Add(modifiedOrders);
小助手
public static class Utils {
public static bool IsAny<T>(this IEnumerable<T> data) {
return data != null && data.Any();
}
}
答案 1 :(得分:2)
DataTable.Copy()本身会创建数据表的深层副本,我不是在谈论DataTable.Copy()的实现,但是复制数据表的方式与它的工作方式相同,就像使用 DeepClone 复制数据,即对一个表的数据所做的更改不会影响另一个表。
因此,在您的情况下,您可以简单地使用: -
DataTable dtCopy = dt.Copy();
或者您也可以使用: -
DataTable dtCopy = dt.Clone();
dtCopy.Merge(dt);