Почему LINQ Query возвращает больше результатов / строк, чем запрашиваемая таблица? - PullRequest
1 голос
/ 28 марта 2011

Для удобства я работаю над однократным преобразованием данных из нескольких листов Excel, которые я импортировал в базу данных. Данные не нормализованы, и я пытаюсь их нормализовать.

У меня есть 3 таблицы в базе данных SQL. Они называются 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 }

Я пытаюсь просмотреть все мои OldTransaction и для каждой OldTransaction создать новую транзакцию, которая указывает Transaction_Asset и Transaction_User на основе сопоставления серийного номера актива и user_EID.

Мой результат дает мне чуть более 10000 записей новых «Транзакций». Я не понимаю, как я могу получить больше записей, чем количество старых транзакций, которые у меня есть.

Какой запрос я могу написать, который будет возвращать одну новую транзакцию для каждой OldTransaction, но с добавленными свойствами Transaction_Asset и Transaction_User, основанными на сопоставлении serial_number и User_EID?

Ответы [ 2 ]

8 голосов
/ 28 марта 2011

Почему бы и нет?Вы выбираете из декартового произведения трех таблиц. Это означает, что общее число строк равно 7903 x 7437 x 9764, что составляет несколько миллиардов: все возможные комбинации строки из OldAssets, строки из OldTransactions и строки из OldUsers,

Затем эти несколько миллиардов фильтруются условием where, и у вас остается чуть более 10000, как вы сказали.

4 голосов
/ 28 марта 2011

По вашему вопросу похоже, что вы просто хотите скопировать все транзакции с дополнительными данными.Я думаю, что-то вроде этого может работать:

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()) }
...