C# 避免数据表查询和生成中的重复
在查询datatable并将其保存到datatable时,避免重复的正确方法是什么。我正在使用下面的模式,一旦表增长,这种模式就非常容易出错。我看了下面的提示。第一个C# 避免数据表查询和生成中的重复,c#,linq,datatable,ado.net,C#,Linq,Datatable,Ado.net,在查询datatable并将其保存到datatable时,避免重复的正确方法是什么。我正在使用下面的模式,一旦表增长,这种模式就非常容易出错。我看了下面的提示。第一个copyToDataTable()看起来不太适用,第二个对我来说太复杂了。我想将下面的代码分成两个单独的方法(第一个用于构建查询,第二个用于检索DataTable)。也许如果我在查询中避免使用匿名类型,那么避免对所有列名进行硬编码应该会更容易些——但不知何故,我对这一点感到迷茫 或 公共数据表检索器ReadyReadingDat
copyToDataTable()
看起来不太适用,第二个对我来说太复杂了。我想将下面的代码分成两个单独的方法(第一个用于构建查询,第二个用于检索DataTable)。也许如果我在查询中避免使用匿名类型,那么避免对所有列名进行硬编码应该会更容易些——但不知何故,我对这一点感到迷茫
或
公共数据表检索器ReadyReadingDataTable()
{
DataTable dtblReadyToSaveToDb=RetrieveDataTableExConstraints();
var query=来自scr中的scrTable.AsEnumerable()
来自productsTable.AsEnumerable()中的产品
其中(scr.字段(“EAN”)==产品字段(“EAN”))
选择
新的
{
Date=DateTime.Today.Date,
ProductId=products.Field(“SkuCode”),
分配器=scr.字段(“分配器”),
Price=float.Parse(scr.Field(“Price”),
Url=scr.Field(“Url”)
};
foreach(查询中的var q)
{
DataRow newRow=dtblReadyToSaveToDb.Rows.Add();
newRow.SetField(“日期”,q.Date);
设置字段(“ProductId”,q.ProductId);
newRow.SetField(“分销商”,q.Distributor);
newRow.SetField(“价格”,q.Price);
设置字段(“Url”,q.Url);
}
返回dtblReadyToSaveToDb;
}
首先,您必须确定在您的案例中“重复”是什么意思。根据您的代码,我想说重复的行在列Date、ProductId和Distributor中具有相同的值。因此,首先为这些列添加多列主键
其次,应该添加一些代码,首先查询现有行,然后将这些现有行与要创建的行进行比较。如果找到一个匹配项,只需不插入新行即可。Hmm,这并不能告诉我太多:(对我来说,重复之处在于我设置了行的名称,而我在第二次时已经这样做了。创建匿名类型第三次。这些也已经在代码开头启动的检索到的TataDable中可用。实际上,第四次,作为q的属性,幸运的是这些是智能感知的。请共享
重试的实现。)veDataTableExConstraints()
这只是使用DataTable RetrieverReady从SQL server检索DataTable的架构…=reader.GetSchemaTable();+一些小的调整来删除PK、允许空值等。你的问题到底是什么?你说的“避免重复”是什么意思?你好,Ivan。我在下面对Virustinity的评论中指出了这一点。对我来说,重复之处在于我硬编码匿名类型中的名称,并再次硬编码它们作为数据行的名称,而这些名称在检索数据表时已经设置好。任何时候都需要在许多地方进行更改。
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;
}