Subsonic 3 Sql Join с использованием SimpleRepository не может присоединиться к столбцам с тем же именем?

Я пытаюсь использовать интерфейс запросов Subsonic Fluent для создания простого внутреннего соединения между двумя таблицами:

[SearchJobResults]

PK SearchJobResultId int
Строка имени
Строка описания

[ParseResults]

PK ParseResultId int
Строка имени
SearchJobResultId int

Между этими таблицами существует отношение 1: 1.

Имейте в виду, я не использую ActiveRecord. У меня есть классы для ParseResult и SearchJobResult, которые работают нормально.

 IDataProvider p  = ProviderFactory.GetProvider("DemacDB");
 SqlQuery query = new SqlQuery(p);            

 var q = new Select(p).From("ParseResults")
         .InnerJoin<SearchJobResult>("SearchJobResultId","SearchJobResultId").GetRecordCount();

Этот код вызывает исключение:

Тестовый метод Models.SearchTests.TestSubsonicQueryMethods вызвал исключение: System.InvalidOperationException: не знаю, к какому столбцу присоединиться - не удается найти столбец SearchJobResultId в таблице ParseResults.

Я просмотрел исходный код SubSonic, чтобы понять, откуда взялось это выполнение:

 private void CreateJoin<T>(string fromColumnName, string toColumnName, Join.JoinType type)
    {
        //see if we can find the table
        var toTable = _provider.FindOrCreateTable(typeof(T));

        //the assumption here is that the FromTable[0] is the table to join from
        if(FromTables.Count == 0)
            throw new InvalidOperationException("Can't join if there's no table to join to - make sure to use From() before InnerJoin");

        if(toTable == null)
            throw new InvalidOperationException("Can't find the table for this type. Try using the Column instead");

        var fromColumn = FromTables[0].GetColumn(fromColumnName);
        if(fromColumn == null)
            throw new InvalidOperationException("Don't know which column to join to - can't find column " + fromColumnName + " in table " + FromTables[0].Name);

        var toColumn = toTable.GetColumn(toColumnName);
        if(toColumn == null)
            throw new InvalidOperationException("Don't know which column to join to - can't find column " + toColumnName + " in table " + toTable.Name);

        CreateJoin(fromColumn, toColumn, Join.JoinType.Inner);
    }

Я пробовал использовать псевдонимы, но это не помогло. Кроме того, если я просто сделаю такой простой запрос, он будет работать нормально:

var d = new Select(p).From("ParseResults").GetRecordCount();

person dmose    schedule 07.02.2010    source источник


Ответы (1)


Оказывается, вам нужно использовать перегрузки Typed T для From / Join, чтобы это заработало.

 var b = new Select(p).From<ParseResult>().InnerJoin<SearchJobResult>("SearchJobResultId", "SearchJobResultId").GetRecordCount();

Работает, поскольку коллекция FromTables в Subsonic теперь правильно перечисляется, потому что она считывает тип из фактического объекта, а не из БД.

person dmose    schedule 07.02.2010