Создание многоразового 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);