避免DataTable查询和构建中的重复
Posted
技术标签:
【中文标题】避免DataTable查询和构建中的重复【英文标题】:Avoid duplication in DataTable query and build 【发布时间】:2016-04-04 05:54:37 【问题描述】:在查询数据表然后将其保存到数据表时,避免重复的正确方法是什么。我正在使用下面的模式,一旦表格增长,它就很容易出错。我看了下面的提示。第一个 copyToDataTable()
看起来不太适用,第二个对我来说太复杂了。我想将以下代码拆分为 2 个单独的方法(第一个用于构建查询,第二个用于检索 DataTable)。也许如果我在查询中避免使用匿名类型,这应该更容易避免对所有列名进行硬编码 - 但我不知何故迷失了这一点。
Filling a DataSet or DataTable from a LINQ query result set 要么 https://msdn.microsoft.com/en-us/library/bb669096%28v=vs.110%29.aspx
public DataTable retrieveReadyReadingDataTable()
DataTable dtblReadyToSaveToDb = RetrieveDataTableExConstraints();
var query = from scr in scrTable.AsEnumerable()
from products in productsTable.AsEnumerable()
where(scr.Field<string>("EAN") == products.Field<string>("EAN"))
select
new
Date = DateTime.Today.Date,
ProductId = products.Field<string>("SkuCode"),
Distributor = scr.Field<string>("Distributor"),
Price = float.Parse(scr.Field<string>("Price")),
Url = scr.Field<string>("Url")
;
foreach (var q in query)
DataRow newRow = dtblReadyToSaveToDb.Rows.Add();
newRow.SetField("Date", q.Date);
newRow.SetField("ProductId", q.ProductId);
newRow.SetField("Distributor", q.Distributor);
newRow.SetField("Price", q.Price);
newRow.SetField("Url", q.Url);
return dtblReadyToSaveToDb;
【问题讨论】:
请分享RetrieveDataTableExConstraints()
的实现
这只是使用 DataTable retrieveReady.... = reader.GetSchemaTable(); 从 SQL 服务器中检索 DataTable 的架构。 + 一些小的调整以删除 PK、允许空值等。
您的真正问题是什么? “避免重复”是什么意思?
嗨伊万。我在下面对 ViRuSTriNiTy 的评论中说明了这一点。对我来说,重复之处在于我硬编码匿名类型中的名称并将它们再次硬编码为 DataRows 的名称,而这些名称在我检索 DataTable 时已经设置。任何时候都有变化,这需要在很多地方进行更改。
【参考方案1】:
首先,您必须确定“重复”在您的情况下的含义。根据您的代码,我会说重复是在 Date、ProductId 和 Distributor 列中具有相同值的行。所以首先为这些列添加一个多列主键。
其次,您应该添加某种代码,首先查询现有行,然后将这些现有行与您要创建的行进行比较。如果找到匹配项,则只需不插入新行即可。
【讨论】:
嗯,这并不能告诉我太多:(对我来说,重复的是我设置了行的名称,当我在第二次这样做时已经这样做了。创建匿名类型第三次。这些也已经在代码开头启动的检索到的 TataDable 中可用。 实际上第四次,作为 q 的属性,幸运的是这些是智能感知的以上是关于避免DataTable查询和构建中的重复的主要内容,如果未能解决你的问题,请参考以下文章
Datatable 正在从我为 Windows 10 构建的 VB.NET 应用程序中的 SQL 查询结果中接收 (01\dd\yyyy) 格式的日期