Я пытаюсь использовать интерфейс запросов Subsonic Fluent для создания простого внутреннего соединения между двумя таблицами:
[SearchJobResults]
PK SearchJobResultId int
Строка имени
Desc string
[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();