2011-03-28 157 views
1

爲了上下文的緣故,我正在從一些導入到數據庫的Excel工作表中進行1次數據轉換。數據未規範化,我試圖對其進行規範化。爲什麼LINQ查詢返回比我查詢的表更多的結果/行?

我在SQL數據庫中有3個表。它們被稱爲OldAssets,OldTransactions和OldUsers。

OldTransactions有7903條記錄。 OldUsers有7437. OldAssets已經9764

我使用LINQ to SQL中使用此代碼

from oa in OldAssets 
from ot in OldTransactions 
from u in OldUsers 
where (oa.Asset_Serial_Number == ot.Asset_Serial_Number && ot.User_EID == u.User_EID && ot.Asset_Tag == oa.Asset_Tag) 
select new Transactions { 
      DevCenter = ot.Transaction_Dev_Center, 
      Action = ot.Transaction_Action, 
      Status = ot.Transaction_Status, 
      ModificationDate = ot.Modified, 
      ModifiedBy = ot.ModifiedBy, 
      CreatedBy = ot.CreatedBy, 
      TransactionDate = (System.DateTime)ot.Transaction_Date, 
      Transaction_Asset = (System.Int32)oa.ID, 
      Transaction_User = (System.Int32)u.ID } 

我試圖去通過我所有的OldTransactions和每個OldTransaction查詢這些表,創建一個新的事務它根據資產序列號和user_EID的映射來指定Transaction_Asset和Transaction_User。

我的結果是給了我剛剛超過10,000條記錄的新「交易」。我不明白我如何獲得比我擁有的OldTransactions數量更多的記錄。

我可以編寫什麼樣的查詢,它將爲每個OldTransaction返回一個新的Transaction,但是基於Serial_number和User_EID的映射添加了Transaction_Asset和Transaction_User的屬性?

回答

4

從你的問題看來,你只是想複製所有交易與其他數據。我覺得像這樣可以工作:

from ot in OldTransactions 
select new Transactions { 
     DevCenter = ot.Transaction_Dev_Center, 
     Action = ot.Transaction_Action, 
     Status = ot.Transaction_Status, 
     ModificationDate = ot.Modified, 
     ModifiedBy = ot.ModifiedBy, 
     CreatedBy = ot.CreatedBy, 
     TransactionDate = (System.DateTime)ot.Transaction_Date, 
     Transaction_Asset = (System.Int32)(
      from oa in OldAssets 
      where oa.Asset_Serial_Number == ot.Asset_Serial_Number && 
        ot.Asset_Tag == oa.Asset_Tag 
      select oa.ID).FirstOrDefault(), 
     Transaction_User = (System.Int32)(
      from u in OldUsers 
      where ot.User_EID == u.User_EID 
      select u.ID). 
       FirstOrDefault()) } 
8

爲什麼不應該這樣?您正在從三個表的笛卡爾積中進行選擇,這意味着總行數爲7903 x 7437 x 9764,這是幾十億:OldAssets中的一行,OldTransactions中的一行以及OldUsers中的一行的所有可能組合。

然後按照where的條件過濾這幾十億個條件,如上所述,剩下的只有10,000多個。

+1

...因此交易可能會在結果集重複時,它已經超過1個用戶/資產組合 – MikeM 2011-03-28 01:34:43

+0

@mdmullinax你說,它完美。 – 2011-03-28 01:37:51

+0

@ ilya-kogan和@mdmullinax - 我希望更新了我的問題,使其更加簡潔。我想知道如何根據序列號和UserEID爲每個OldTransaction生成一個新的單個事務。 – 2011-03-28 01:50:06