2011-03-28 114 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