2015-12-30 69 views
2

在查詢datatable並將其保存到DataTable時避免重複的正確方法是什麼?我正在使用下面的模式,一旦表增長,它會變得非常容易出錯。我看了下面的提示。第一個copyToDataTable()看起來不太適用,第二個對於我來說太複雜了。我想將下面的代碼拆分爲2個獨立的方法(首先構建查詢,第二個方法檢索DataTable)。也許如果我在查詢中避開匿名類型,這應該會更容易避免對所有列名進行硬編碼 - 但我有點不知所措。避免在DataTable查詢中重複並構建

Filling a DataSet or DataTable from a LINQ query result sethttps://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; 
    } 
+0

請分享執行'RetrieveDataTableExConstraints()' – ViRuSTriNiTy

+0

這只是從DataTable中檢索DataTable的數據表模式retrieveReady .... = reader.GetSchemaTable(); +一些小的調整來消除PK,允許空值等。 – Turo

+0

你真正的問題是什麼?你是什​​麼意思「避免重複」? –

回答

0

首先,你必須決定什麼是 「複製」,在你的這種情況。根據你的代碼,我會說重複是在Date,ProductId和Distributor列中具有相同值的行。因此,首先爲這些列添加多列主鍵。其次,您應該添加一些代碼,先查詢現有行,然後將這些現有行與您想要創建的行進行比較。如果找到匹配,那麼只需不要插入新行。

+0

嗯,這並沒有真正地告訴我很多:(對於我來說,重複的是我設置了行的名字,當我在第二次創建匿名類型3rd時已經這樣做了,這些也已經在檢索到的TataDable中可用代碼的開始。 – Turo

+0

實際上是第四次,因爲q的屬性,幸運的是這些是智能授權 – Turo