В linq как динамически передать имя таблицы и столбца - PullRequest
1 голос
/ 11 июля 2010

Я хочу написать динамический linq, где я отправляю имя таблицы и столбца, этот запрос возвращает мне максимальный номер строки таблицы.

SELECT ISNULL(MAX(intProductCode) + 1, 1) AS intProductCode FROM tblProductInfo

Выше приведен мой синтаксис T-SQL. Я хочу такой же вывод из linq, как и

Если я напишу этот приведенный ниже синтаксис, выведите его, но здесь я не могу установить имя таблицы и столбца

this.Context.tblProductInfos.Max(p=>p.intProductCode)

Как установить имя таблицы и столбца на linq, которые возвращают максимальный номер строки этой таблицы.

Ответы [ 3 ]

1 голос
/ 11 июля 2010

LINQ не ответ на все вопросы. Конечно, вы можете запросить контекст данных, чтобы получить всю эту информацию, но вы будете выполнять лот работы (отражение или отображение, плюс построение Expression), просто для генератора sql отменить все , чтобы вернуть TSQL. Было бы на много проще просто построить TSQL (убедитесь, что белый список имен таблиц / столбцов для предотвращения внедрения) и использовать ExecuteQuery.

Например:

string tsql = string.Format(
      "SELECT ISNULL(MAX([{0}]) + 1, 1) AS [{0}] FROM [{1}]",
       colName, tableName);

int max = dataContext.ExecuteQuery<int>(tsql).First();

Также; если intProductCode является IDENTITY, вы можете посмотреть на IDENT_CURRENT(tableName), что на намного более эффективно, чем MAX.

1 голос
/ 12 июля 2010

Вот, пожалуйста:

int GetMax<T>(DataContext dc, Expression<Func<T, int>> selector)
{
  int result = dc.GetTable<T>().Max(selector);
  return result;
}

Вызывается так:

int maxId = GetMax<Customer>(myDC, c => c.CustomerId);

С другой стороны, вы можете просто использовать столбцы IDENTITY в базе данных. Тогда вам не нужно +1, и вам не придется сталкиваться с коллизиями из нескольких соединений.

0 голосов
/ 11 июля 2010

Насколько я понимаю, вам здесь не нужен динамический linq.

Вам просто нужно перестать думать в терминах магических строк SQL, таких как имена таблиц и столбцов.L2S позволяет писать запросы строго по типу.Изучите код, который вы уже написали.

this.Context.tblProductInfos.Max(p=>p.intProductCode)
  1. tblProductInfos на самом деле является строго типизированным «именем таблицы»
  2. p=>p.intProductCode - это выражение для получения «имени столбца»

Все хорошо и понятно.Никаких волшебных струн не требуется.Вот для чего ORM.

...