дозвуковое соединение 2 на нескольких столбцах

Я хочу передать следующее утверждение в SubSonic 2.2

    SELECT b.*
    FROM tableA a
      INNER JOIN tableB b
        ON (a.year = b.year AND a.month = b.monath AND a.userid = b.userid);

Моя проблема в том, что команда SubSonic SqlQuery.LeftInnerJoin () не имеет перегрузки, которая занимает более одного столбца.

Поскольку любое соединение можно переписать только с помощью предложений where, я сделал в своем sql следующее:

    SELECT b.*
    FROM tableA a, tableB b
    WHERE a.year = b.year
      AND a.month = b.month
      AND a.userid = b.userid

который должен дать тот же результат (на самом деле, по крайней мере, для mysql, между этими операторами нет абсолютно никакой логической разницы).

Но я также застрял, переводя это на дозвуковой, потому что член «IsEqualTo (...)» достаточно умен, чтобы понять, что мой параметр является строкой, и заключить его в кавычки.

DB.Select("TableB.*")
  .From<TableA>()
  .From<TableB>()
  .Where(TableA.YearColumn).IsEqualTo("TableB.Year")
  .And(TableA.MonthColumn).IsEqualTo("TableB.Month")
  .And(TableA.UseridColumn).IsEqualTo("TableB.UserId")

(Я пробовал разные способы установки параметра IsEqualTo)

IsEqualTo(TableB.YearColumn)
IsEqualTo(TableB.YearColumn.QualifiedName)

Либо параметр интерпретируется как

TableA.Year = 'TableB.Year'

или я получаю исключение SqlQueryException.

Может кто-нибудь сказать мне, как сделать этот запрос с дозвуковой (либо первый - с JOIN, либо второй)? Спасибо


person Jürgen Steinblock    schedule 06.05.2010    source источник
comment
Вы пытались проверить генерируемый оператор SQL? то есть SubSonic.SqlQuery s = New SubSonic.Select (). From (...; Console.WriteLine (s.ToString ());   -  person sparks    schedule 06.05.2010
comment
Да, как я уже упоминал, SubSonic обрабатывает мой параметр как строку (что не приведет к сбою, но в этом случае неверно (SELECT * FROM tableA, tableB WHERE tableA.Year = 'TableB.Year' никогда не вернет строку)   -  person Jürgen Steinblock    schedule 07.05.2010


Ответы (1)


С SubSonic 2 из коробки вы не сможете.

При этом у вас есть следующие альтернативы:

Расширение SubSonic

Если вы уже знакомы с SubSonic, вы можете подумать о добавлении многоколоночных объединений в сам SubSonic.

Использование представлений, хранимых процедур, табличных функций

Если вы не хотите возиться с кодом SubSonics, используйте представления, хранимые процедуры и / или табличные функции на сервере sql. SubSonic упрощает доступ к данным из представлений и хранимых процедур.

Используйте InlineQuery

InlineQuery позволяет выполнять любой sql - если это вариант, чтобы в вашем коде был чистый sql.

Уродливый обходной путь с InlineQuery

Если вы абсолютно хотите создать свой запрос с помощью SubSonic, вы можете попробовать следующее:

SqlQuery q = DB.Select()
  .From<TableA>()
  .CrossJoin<TableB>()
  .Where(TableA.YearColumn).IsEqualTo(0)
  .And(TableA.MonthColumn).IsEqualTo(0)
  .And(TableA.UseridColumn).IsEqualTo(0);

Создайте инструкцию SQL и замените имена параметров:

string s = q.BuildSqlStatement();
s = s.Replace(q.Constraints[0].ParameterName, TableB.YearColumn.QualifiedName);
s = s.Replace(q.Constraints[1].ParameterName, TableB.MonthColumn.QualifiedName);
s = s.Replace(q.Constraints[2].ParameterName, TableB.UserIdColumn.QualifiedName);

Затем используйте s с InlineQuery.

person marapet    schedule 19.05.2010
comment
Я использовал для этого InlineQuery, возможно, я расширю дозвуковой источник позже, если у меня будет время простоя. - person Jürgen Steinblock; 04.06.2010