为什么LINQ查询返回比我查询的表更多的结果/行?

And*_*der 1 c# normalization linq-to-sql

为了上下文,我正在从已导入数据库的多个Excel工作表中进行一次数据转换.数据未规范化,我正在尝试将其标准化.

我在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 }
Run Code Online (Sandbox Code Playgroud)

我正在尝试遍历所有OldTransactions,并为每个OldTransaction创建一个新事务,该事务根据资产序列号和user_EID的映射指定Transaction_Asset和Transaction_User.

我的结果是给了我超过10,000条新的"交易记录".我不明白我怎么能获得比我拥有的OldTransactions数量更多的记录.

我可以编写哪些查询将为每个OldTransaction返回一个新的Transaction,但是根据serial_number和User_EID的映射添加了Transaction_Asset和Transaction_User的属性?

Ily*_*gan 8

为什么不呢?你从三个表的笛卡尔积中选择,意味着总行数是7903 x 7437 x 9764,这是几十亿:来自OldAssets的一行的所有可能组合,来自OldTransactions的一行和来自OldUsers的一行.

然后根据where条件对这几十亿进行过滤,如你所说,你只剩下10,000多.