Можно ли использовать / обращаться к скалярным функциям с помощью LINQ to SQL? - PullRequest
6 голосов
/ 11 ноября 2008

В нашей базе данных есть скалярные функции для возврата таких вещей, как «количество задач для клиента» или «общая сумма счета для клиента».

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

Есть ли способ использовать или получить доступ к скалярным функциям с помощью LINQ to SQL? Если это так, мне было бы интересно посмотреть пример того, как ... если нет, как лучше всего справиться с ситуацией такого типа ... если это даже выполнимо.

Ответы [ 2 ]

9 голосов
/ 11 ноября 2008

LINQ-to-SQL поддерживает использование с UDF, если вы это имеете в виду. Просто перетащите UDF на поверхность дизайнера, и все готово. Это создает метод сопоставления для контекста данных, помеченный [Function(..., IsComposable=true)] или аналогичный, сообщающий LINQ-to-SQL, что он может использовать это в запросах (обратите внимание, что EF не поддерживает это использование).

Затем вы будете использовать его в своем запросе как:

var qry = from cust in ctx.Custs
           select new {Id = cust.Id, Value = ctx.GetTotalValue(cust.Id)};

, который станет TSQL примерно таким:

SELECT t1.Id, dbo.MyUdf(t1.Id)
FROM CUSTOMER t1

(или около того).

Тот факт, что это компоновка, означает, что вы можете использовать значение в запросах - например, в Where() / WHERE - и таким образом уменьшить объем данных, возвращаемых с сервера (хотя, очевидно, UDF все равно потребуется быть исполненным каким-либо образом).

Вот аналогичный пример , показывающий псевдо-UDF при использовании в контексте данных, иллюстрирующий, что версия метода на C # не используется.

На самом деле, в настоящее время я смотрю на такие UDF, чтобы обеспечить возможность компоновки данных "вне модели" - т.е. определенной части системы требуется доступ к некоторым данным (которые находятся в той же базе данных), что и на самом деле не часть той же модели, но которую я хочу JOIN интересными способами. У меня также есть существующие SP для этой цели ... поэтому я смотрю на портирование этих SP на табличные UDF, которые обеспечивают уровень контракта / абстракции, окружающий данные вне модели. Так как это не является частью моей модели, я могу получить ее только через UDF - но у меня сохраняется возможность составить это с моей обычной моделью.

1 голос
/ 11 ноября 2008

Я считаю, эта документация MSDN - это то, что вам нужно (как часть этой более широкой темы вызова пользовательских функций в LINQ to SQL ). Не могу сказать, что сделал это сам, но это звучит правильно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...