Дозвуковой: одно и то же имя столбца разные таблицы - PullRequest
1 голос
/ 01 июня 2009

У меня есть запрос, в котором мне нужно выполнить предложение «Где» для двух разных столбцов в двух разных таблицах, но Subsonic создает одинаковое имя параметризованного параметра для обеих, что вызывает проблему. Как я могу это исправить?

string _RawSql = new Select()
  .From(Tables.Table1)
  .InnerJoin(Tables.Table2)
  .InnerJoin(Table3.SidColumn, Table2.Table3SidColumn)
  .Where(Table1.SidColumn).IsEqualTo(2)
  .And(Table3.SidColumn).IsEqualTo(1)
  .BuildSqlStatement();

Запрос, который он создает,

SELECT ....
FROM [dbo].[Table1]
INNER JOIN [dbo].[Table2] ON [dbo].[Table1].[Table2Sid] = [dbo].[Table2].[Sid]
INNER JOIN [dbo].[Table3] ON [dbo].[Table2].[Table3Sid] = [dbo].[Table3].[Sid]
WHERE [dbo].[Table1].[Sid] = @Sid
AND [dbo].[Table3].[Sid] = @Sid

Обратите внимание, что в последних двух строках используется @Sid как для Table1, так и для Table3. Как мне это сделать, чтобы он использовал @ Sid0 и @ Sid1?

Любая помощь будет оценена. Спасибо


Спасибо за ответ, я действительно ценю это. Я использую 2.1 Я уже использую TableColumn. Ниже приведен дозвуковой код c # ...

.Where(Table1.SidColumn).IsEqualTo(2)  
.And(Table3.SidColumn).IsEqualTo(1)

, который создает следующий sql при просмотре в sql profiler

WHERE [dbo].[Table1].[Sid] = @Sid
AND [dbo].[Table3].[Sid] = @Sid

Не могли бы вы показать мне, как я могу заменить эти строки так, как вы предлагаете? Я действительно предпочел бы не использовать литерал "Table2.Sid = 2"


Ранмор, проблема та же с переменными или с константами.

Я даже пытался

.Where("Table1.Sid").IsEqualTo(2)  
.And("Table3.Sid").IsEqualTo(1)

Это создает запрос как

WHERE Table1.Sid = @Table1.Sid0
AND Table3.Sid = @Table3.Sid1

Я, наконец, получаю разные параметризованные переменные в этом случае, но теперь SQL Server жалуется, потому что это не нравится. в параметризованных именах переменных.

Понятия не имею, как выполнить объединение с двумя предложениями where для 2 разных таблиц!

Ответы [ 3 ]

1 голос
/ 01 июня 2009

Какую версию вы используете? В 2.2 Вы можете использовать объект TableColumn, чтобы обойти это (он может быть таким же и для 2.1. Поэтому вместо использования структуры, как вы делаете, вы можете использовать объект (Table2.SidColumn).

Если push доходит до толчка - вы можете переопределить все с помощью строки - так что в вашем случае вы можете использовать «Table1.Sid» и «Table2.Sid» прямо в методе Where ().

0 голосов
/ 10 августа 2011

Я не уверен, какая у меня версия кода, но ваш запрос выдает мне пронумерованные параметры.

Если вы посмотрите на строку 255 файла ANSISqlGenerator.cs https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/SqlQuery/SqlGenerators/ANSISqlGenerator.cs

c.ParameterName = String.Concat(col.ParameterName, query.Constraints.IndexOf(c));

К параметрам действительно должны быть добавлены числа ... может быть, вытащить последнюю версию?

0 голосов
/ 03 июня 2009

Я не смог подтвердить это, но, возможно, проблема возникает только с литералами? (не уверен, что ваш пример кода для краткости таков)

int table1SidColumnValue = 2;
int table3SidColumnValue = 1;

.Where(Table1.SidColumn).IsEqualTo(table1SidColumnValue)
.And(Table3.SidColumn).IsEqualTo(table2SidColumnValue)

Я помню проблему с этим при использовании нескольких предложений .In () с литеральными значениями, но не уверен, что это относится к вашей проблеме.

...