Simple.Data - как двунаправленно присоединиться к одной и той же таблице дважды

Я знаю, что я близок с этим ...

Моя структура:

У меня есть несколько компаний. У каждой компании есть основной пользователь (аккаунт) и список всех пользователей (аккаунты).

Я реализовал это в базе данных как таблицу компаний, которая имеет «Первичный» в качестве внешнего ключа для таблицы «Учетные записи», а таблица «Учетные записи» имеет CompanyId, который является внешним ключом для таблицы «Компании».

Таким образом, всегда есть только один основной пользователь, и каждый пользователь связан с одной компанией.

Я хочу получить список всех компаний и поместить их в объект С#. Что у меня есть до сих пор:

public IEnumerable<Company> GetAllCompaniesList()
    {
        var allData = database.Companies.All()
            .Join(database.Accounts).On(database.Accounts.Id == database.Companies.Primary)
            .Join(database.Accounts).On(database.Accounts.CompanyId == database.Companies.Id)
            .ToList<Company>();
        return allData;
    }

и он работает в моих тестах с использованием встроенного в память адаптера с соответствующими настроенными ключами, но не в реальной версии, вылетая с

Объекты «dbo.Accounts» и «dbo.Accounts» в предложении FROM имеют одинаковые открытые имена. Используйте корреляционные имена, чтобы различать их.

Я думаю, это означает, что мне нужно назвать каждое соединение (например, чтобы сделать sql как «присоединить a к a = b как c»), но я не могу найти синтаксис для этого. Кто-нибудь знает?


person tenshi_a    schedule 24.08.2012    source источник
comment
Если вы хотите получить список всех Компаний, зачем вы присоединяетесь к Аккаунтам?   -  person saj    schedule 24.08.2012


Ответы (1)


Вы можете создавать псевдонимы имен таблиц, используя метод .As. Кроме того, метод Join имеет необязательный второй параметр out, который помещает ссылку на таблицу с псевдонимом в динамическую переменную; это просто упрощает обращение к таблице.

Итак, попробуйте следующее:

public IEnumerable<Company> GetAllCompaniesList()
{
    dynamic primary;
    var allData = database.Companies.All()
        .Join(database.Accounts.As("PrimaryAccounts"), out primary)
            .On(primary.Id == database.Companies.Primary)
        .Join(database.Accounts)
            .On(database.Accounts.CompanyId == database.Companies.Id)
        .ToList<Company>();
    return allData;
}

Это должно работать нормально.

person Mark Rendle    schedule 24.08.2012