C# 避免数据表查询和生成中的重复

C# 避免数据表查询和生成中的重复,c#,linq,datatable,ado.net,C#,Linq,Datatable,Ado.net,在查询datatable并将其保存到datatable时,避免重复的正确方法是什么。我正在使用下面的模式,一旦表增长,这种模式就非常容易出错。我看了下面的提示。第一个copyToDataTable()看起来不太适用,第二个对我来说太复杂了。我想将下面的代码分成两个单独的方法(第一个用于构建查询,第二个用于检索DataTable)。也许如果我在查询中避免使用匿名类型,那么避免对所有列名进行硬编码应该会更容易些——但不知何故,我对这一点感到迷茫 或 公共数据表检索器ReadyReadingDat

在查询datatable并将其保存到datatable时,避免重复的正确方法是什么。我正在使用下面的模式,一旦表增长,这种模式就非常容易出错。我看了下面的提示。第一个
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;
    }