Подтвердить что ты не робот

Можно ли вызвать хранимую процедуру с помощью LINQ в LINQPad?

В визуальной студии у вас есть хороший дизайнер, который инкапсулирует сохраненный процесс с помощью отличного маленького метода. Я полностью люблю LINQPad и ежедневно его использую на работе (мне не нужно было открывать SQL Studio для моей работы, так как я ее использовал!) И хотел бы вызвать хранимые procs при ее использовании.

Боюсь, я знаю ответ на свой вопрос, но я надеюсь, что, может быть, есть какая-то особенность, которую я пропускаю, или, возможно, у кого-то есть черная магия, которую они могут одолжить мне, чтобы это произошло. Кстати, я использую LINQPad 4, если это имеет значение.

Edit
См. Мой ответ ниже.

4b9b3361

Ответ 1

По крайней мере, в моей копии LINQPad хранимые процедуры отображаются в дереве данных и могут быть вызваны напрямую.

Вот скриншот:

Screenshot

Ответ 2

Подводя некоторые другие ответы, а также добавив немного дополнительной информации:

Подключитесь к источнику данных с помощью драйвера по умолчанию (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, потому что объекты строки являются динамическими.

Ответ 3

Мой ответ (спасибо Даниэлю, спасибо.)

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

Основная разница между текущей версии (я использую 4.26.2 по состоянию на эту дату) является то, что LINQ в VS возвращает пользовательские типы данных, чтобы соответствовать объекты данных, возвращаемых из хранимой процедуры и LINQPad возвращает DataSet. Поэтому, выбрав "С# Statement (s)", вы можете успешно запустить это как запрос:

DataSet fooResults = foo_stored_proc(myParam);

Спасибо за помощь!

Ответ 4

Я использую версию 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

Ответ 5

Пример: скажем, у меня есть 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");   

Другие ответы частично верны - я не видел ничего передающего в параметрах (при необходимости).

Ответ 6

Используя пример, который использовал @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"]}");
} 

Ответ 7

Вы можете просто сохранить запрос, который использует С# со стандартными объектами ADO.NET(SqlConnection, SqlCommand и т.д.) и Dump() результаты.

Я понимаю, что он не использует LINQ, но он хорошо меня обслуживает.