Simple.Data - 如何在同一个表上双向连接两次

时间:2012-08-24 14:00:45

标签: c# asp.net-mvc simple.data

我知道我和这个人很接近......

我的结构是:

我有一些公司 每家公司都有一个主要用户(帐户) 以及所有用户(帐户)的列表。

我已在db中将此实现为具有“Primary”作为Accounts表的外键的公司表,而Accounts表具有CompanyId,它是Companies表的外键。

因此,只有一个主要用户,每个用户都与一家公司相关联。

我想检索所有公司的列表,并将它们放在c#对象中。到目前为止我所拥有的是:

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;
    }

并且它在我的测试中使用内置适配器并且设置了相关的键,但不是在真实版本中,而是崩溃了

  

FROM子句中的对象“dbo.Accounts”和“dbo.Accounts”具有   相同的暴露名称。使用相关名来区分它们。

我认为这意味着我需要命名每个连接(例如,使sql像“将a = b连接为c”),但我找不到这样做的语法。有人知道吗?

1 个答案:

答案 0 :(得分:2)

您可以使用.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;
}

这应该可以正常工作。