Передача списка в БД и присоединение свойства к таблице - PullRequest
2 голосов
/ 20 сентября 2011

У меня есть список Sometype.Sometype имеет два свойства

Key

ModificationDate

Теперь у меня есть таблица в моей БД под названием Measures. Она также имеет эти поля в виде столбцов.

Я просто хочу получить все меры (ключи должны совпадать) и Modiciationdate (из списка)> ModiciationDate (из таблицы).

Сейчас я выбираю все меры из моей таблицы ипроверяя это в моем приложении. Как я могу избежать этого?

PS Я использую Nhibernate. Sometype на самом деле является сущностью в моем приложении. У меня также есть другая сущность, сопоставленная с МерамиТаблица (оба не могут быть одинаковыми, так как у нее также есть некоторые дополнительные свойства)

EDIT что мне нужно, если список, который у меня есть, находится в некотором роде, то запрос будетbe

select * from Measures A join TempTable B on A.Key=B.Key and A.ModificationDate < B.ModificationDate.

Но можно ли это сделать, не вставляя все значения из списка в некоторую #table?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

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

Примерэта функция:

FUNCTION ListToTable
(  @SEP char(1),
   @LST varchar(max)
) RETURNS @TBL TABLE (idx int, txt varchar(max)) AS
BEGIN
   DECLARE @IX int, @POS int, @COUNT int, @STR varchar(max)
   SET @POS = 1
   SET @IX = 1
   SET @COUNT = 0
   WHILE @IX > 0
   BEGIN
      SET @IX = charindex(@SEP, @LST, @POS)
      IF @IX > 0
         SET @STR = substring(@LST, @POS, @IX - @POS)
      ELSE
         SET @STR = substring(@LST, @POS, len(@LST))
      SET @COUNT = @COUNT + 1
      INSERT @TBL (idx, txt) VALUES(@COUNT, @STR)
      SET @POS = @IX + 1
   END
   RETURN
END

Затем, когда вы выполняете запрос, вы можете сказать:

SELECT * FROM
Measures A 
INNER JOIN
ListToTable(',', '1,1,2,3,5,8,...,21')  B 
ON A.Key=B.Key 
AND A.ModificationDate < B.ModificationDate.

Если вам нужно выполнить какое-то приведение к таблице, чтобы сделать идентификаторы целочисленными, или что-то еще;Все в порядке.Я не уверен, что вы можете получить это в HQL, но он отлично работает как запрос.

0 голосов
/ 21 сентября 2011

Вы можете использовать этот подход.

В коде напишите метод для создания желания sql.

    private string BuildSQL(List<SomeType> param)
            {
                string res = string.Empty;

                if (param != null && param.Count > 0)
                {
                    foreach (SomeType type in param)
                    {
                        res += " (A.Key='" + type.Key + "' AND A.ModificationDate < '" + type.ModificationDate + "') OR";
                    }
                }
    if(!string.IsNullOrEmpty(res))
{
res = res.Substring(0, res.Length - 3);
}
                return res;
            }

, а затем просто передайте этот sql в функцию вызова (возможно, класс DAO):

string sqlString = "select * from Measures A, где" + BuildSQL (param);OdbcCommand.CommandText = sqlString;OdbcCommand.executeNonQuery ();

Hth.

...