Я пытаюсь использовать интерфейс запросов 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();