дозвуковой 2 объединить на нескольких столбцах - PullRequest
0 голосов
/ 06 мая 2010

Я хочу перенести следующее утверждение в 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, логически нет абсолютно никакой разницы между этими утверждениями).

Но я также застрял, переводя это в subsonic, потому что член "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 или второй)? Спасибо

1 Ответ

1 голос
/ 19 мая 2010

С 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.

...