Создание многоразового Linq для SQL для хранимых процедур
Я работаю над новым проектом, который должен использовать Linq To SQL
. Меня попросили создать общий или многоразовый класс Linq To SQL
, который можно использовать для выполнения хранимых процедур.
В ADO.Net
Я знал, как это сделать, просто передав строку из того, что я хотел выполнить, и я мог бы передать разные строки для каждого запроса, который мне нужно запустить:
SqlCommand cmd = new SqlCommand("myStoredProc", conn); // etc, etc
Я борюсь с тем, как создать нечто подобное в Linq To SQL
, если это возможно. Я создал файл .dbml
и добавил к нему свою хранимую процедуру. В результате я могу вернуть результаты, используя следующий код:
public List<myResultsStoreProc> GetData(string connectName)
{
MyDataContext db = new MyDataContext (GetConnectionString(connectName));
var query = db.myResultsStoreProc();
return query.ToList();
}
Код работает, но они хотят, чтобы я создал один метод, который вернет любую хранимую процедуру, которую я ему скажу. Я искал в Интернете и общался с коллегами об этом и не смог найти способ создания повторно используемого хранимого класса proc.
Итак, существует ли способ создать повторно используемый класс Linq To SQL
для выполнения хранимых процедур?
Edit:
Что я ищу, если есть способ сделать что-то вроде следующего?
public List<string> GetData(string connectName, string procedureName)
{
MyDataContext db = new MyDataContext (GetConnectionString(connectName));
var query = db.procedureName();
return query.ToList();
}
Я рассмотрел документы MSDN на Linq To SQL
, и они показывают таблицу в IEnumerable
:
IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
@"select c1.custid as CustomerID, c2.custName as ContactName
from customer1 as c1, customer2 as c2
where c1.custid = c2.custid"
);
Я ищу что-то очень общее, где я могу отправить строковое значение сохраненного proc, который я хочу выполнить. Если это невозможно, есть ли какая-либо документация о том, почему это невозможно сделать таким образом? Мне нужно доказать, почему мы не можем передать строковое значение имени процедуры для выполнения в Linq To SQL
Ответы
Ответ 1
DataContext.ExecuteCommand не совсем то, что вы ищете, поскольку оно возвращает только значение int. Вместо этого вы должны указать DataContext.ExecuteQuery, который способен выполнять хранимую процедуру и возвращать набор данных.
Я бы создал частичный класс для вашего DBML, в котором будет храниться эта функция.
public List<T> GetDataNoParams(string procname)
{
var query = this.ExecuteQuery<T>("Exec " + procname);
return query.ToList();
}
public List<T> GetDataParams(string procname, Object[] parameters)
{
var query = this.ExecuteQuery<T>("Exec " + procname, parameters);
return query.ToList();
}
Чтобы вызвать хранимую процедуру, выполните следующие действия:
GetDataNoParams("myprocedurename");
или
GetDataParams("myotherprocedure {0}, {1}, {2}", DateTime.Now, "sometextValue", 12345);
или
GetDataParams("myotherprocedure var1={0}, var2={1}, var3={2}", DateTime.Now, "sometextValue", 12345);
Если вы хотите вызывать процедуры без возвращаемого значения, которое тоже достаточно просто, как я уверен, вы можете увидеть, создав новый метод, который не сохраняет/не возвращает ничего.
Вдохновение исходило от http://msdn.microsoft.com/en-us/library/bb361109(v=vs.90).aspx.
Ответ 2
Самый простой ответ на ваш вопрос заключается в том, что вы можете захватить свойство Connection
вашего MyDataContext
и создать и выполнить свой собственный SqlCommand
точно так же, как и в ADO.Net. Я не уверен, что это послужит вашим целям, особенно если вы хотите получить объекты из вашей модели LINQ to SQL.
Если вы хотите вернуть объекты из модели, посмотрите на метод DataContext.ExecuteCommand
.
Ответ 3
Когда мы отбрасываем таблицу или хранимую процедуру в нашем .dbml файле, он создает свой класс, который связывается с уровнем данных и нашей бизнес-логикой.
В Linq to SQL мы должны иметь StoredProcedures или Tables, присутствующие в файле .dbml, иначе нет способа вызвать общий метод в Linq to SQL для вызова хранимой процедуры, передав его имя методу.
Но в ADO.Net мы можем это сделать (как вы знаете)
SqlCommand cmd = new SqlCommand("myStoredProc", conn);