Ответ 1
По крайней мере, в моей копии LINQPad хранимые процедуры отображаются в дереве данных и могут быть вызваны напрямую.
Вот скриншот:
В визуальной студии у вас есть хороший дизайнер, который инкапсулирует сохраненный процесс с помощью отличного маленького метода. Я полностью люблю LINQPad и ежедневно его использую на работе (мне не нужно было открывать SQL Studio для моей работы, так как я ее использовал!) И хотел бы вызвать хранимые procs при ее использовании.
Боюсь, я знаю ответ на свой вопрос, но я надеюсь, что, может быть, есть какая-то особенность, которую я пропускаю, или, возможно, у кого-то есть черная магия, которую они могут одолжить мне, чтобы это произошло. Кстати, я использую LINQPad 4, если это имеет значение.
Edit
См. Мой ответ ниже.
По крайней мере, в моей копии LINQPad хранимые процедуры отображаются в дереве данных и могут быть вызваны напрямую.
Вот скриншот:
Подводя некоторые другие ответы, а также добавив немного дополнительной информации:
Подключитесь к источнику данных с помощью драйвера по умолчанию (LINQ to SQL). Убедитесь, что установлен флажок Включить хранимые процедуры и функции.
Сохраненные процедуры и функции теперь доступны как функции .NET(например, С#) в запросах с использованием соединения. Параметры, требуемые функцией, отражают параметры, требуемые хранимой процедурой или функцией базы данных.
Значение, возвращаемое функцией, - это ReturnDataSet
, тип LINQPad, полученный из DataSet
. К сожалению, выполнять запросы LINQ на наборах данных не так просто, но LINQPad предоставляет метод расширения AsDynamic()
, который будет принимать первую таблицу возвращаемого набора данных (обычно есть только одна таблица) и преобразовывать строки в IEnumerable<Object>
, где объекты в коллекции являются динамическими, позволяя вам получить доступ к значениям столбцов в качестве свойств. Например. если ваша хранимая процедура возвращает столбцы Id
и Name
, вы можете использовать LINQ:
SomeStoredProc().AsDynamic().Where(row => row.Id == 123 && row.Name == "Foo")
К сожалению, у вас не будет intellisense, потому что объекты строки являются динамическими.
Мой ответ (спасибо Даниэлю, спасибо.)
Даниэль помог мне понять, что хранимые процедуры можно вызвать, если вы нацеливаете базу данных с выпадающим списком в окне запроса; то в окне запроса вызовите сохраненный proc по его имени и добавьте круглые скобки в конец, чтобы вызвать его как функцию.
Основная разница между текущей версии (я использую 4.26.2 по состоянию на эту дату) является то, что LINQ в VS возвращает пользовательские типы данных, чтобы соответствовать объекты данных, возвращаемых из хранимой процедуры и LINQPad возвращает DataSet. Поэтому, выбрав "С# Statement (s)", вы можете успешно запустить это как запрос:
DataSet fooResults = foo_stored_proc(myParam);
Спасибо за помощь!
Я использую версию 4.51.03 и подключаюсь к выпуску SQL Server 2012 Express. После подключения к базе данных AdventureWorks2012 я могу просмотреть все хранимые процедуры. Щелкните правой кнопкой мыши хранимую процедуру и выберите раскрывающийся список StoredProceedureName (...), вы увидите хранимую процедуру в окне запроса. Вам нужно вставить параметры в круглую скобку, охватывающую многоточие, и выполнить запрос.
Примеры показаны в следующих двух сообщениях:
http://hodentekmsss.blogspot.com/2015/01/learn-querying-sql-server-2012-using.html
http://hodentekmsss.blogspot.com/2015/01/learn-querying-sql-server-2012-using_25.html
Пример: скажем, у меня есть PersonMatchNoDOBRequired
процедура с именем PersonMatchNoDOBRequired
и она ожидает, что я PersonMatchNoDOBRequired
и PersonMatchNoDOBRequired
var b = PersonMatchNoDOBRequired("John", "Smith").AsDynamic();
b.Dump();
Если мне нужна дополнительная фильтрация (в моем случае у меня есть продвинутый алгоритм в sql, который оценивает имя и фамилию, имя может возвращать "Jodi", но, скажем, я действительно хочу отфильтровать его дальше, тогда это так:
var b = PersonMatchNoDOBRequired("John", "Smith").AsDynamic().Where(x => x.FirstName == "John" && x.LastName == "Smith");
Другие ответы частично верны - я не видел ничего передающего в параметрах (при необходимости).
Используя пример, который использовал @jlafay, вы можете извлечь строки из таблицы и ссылаться на столбец по имени.
DataSet spItem = sp_StoredProcedure(parameters);
var rows = spItem.Tables[0].Rows;
foreach (DataRow row in rows)
{
// Do something
Console.WriteLine($"{row["MyColumn"]}, {row["LastName"]}");
}
Вы можете просто сохранить запрос, который использует С# со стандартными объектами ADO.NET(SqlConnection
, SqlCommand
и т.д.) и Dump()
результаты.
Я понимаю, что он не использует LINQ, но он хорошо меня обслуживает.