为存储过程创建可重用的Linq To SQL

Tar*_*ryn 16 c# linq ado.net linq-to-sql

我正在开发一个需要使用的新项目Linq To SQL.我被要求创建一个Linq to SQL可用于执行存储过程的通用或可重用类.

ADO.Net我知道如何通过传递一个我想要执行的字符串来执行此操作,我可以为我需要运行的每个查询传递不同的字符串:

SqlCommand cmd = new SqlCommand("myStoredProc", conn); // etc, etc
Run Code Online (Sandbox Code Playgroud)

Linq To SQL如果可能的话,我正在努力创造类似的东西.我创建了一个.dbml文件并将存储过程添加到其中.因此,我可以使用以下代码返回结果:

public List<myResultsStoreProc> GetData(string connectName)
{
   MyDataContext db = new MyDataContext (GetConnectionString(connectName));
   var query = db.myResultsStoreProc();

   return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)

代码可以工作但是他们希望我创建一个方法来返回我告诉它运行的任何存储过程.我在网上搜索并与同事讨论过这个问题,并且找不到创建可重用存储过程类的方法也没有成功.

那么有没有办法创建一个可重用的Linq to SQL类来执行存储过程?

编辑:

我正在寻找的是,如果有办法做以下的事情?

public List<string> GetData(string connectName, string procedureName)
{
   MyDataContext db = new MyDataContext (GetConnectionString(connectName));
   var query = db.procedureName();

   return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)

我已查看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"
);
Run Code Online (Sandbox Code Playgroud)

我正在寻找非常通用的东西,我可以在其中发送我想要执行的存储过程的字符串值.如果这是不可能的,有没有关于为什么不能这样做的文件?我需要证明为什么我们不能传递要执行的过程名称的字符串值Linq To Sql

Pet*_*ter 18

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();
}
Run Code Online (Sandbox Code Playgroud)

要调用存储过程,您将执行以下操作:

GetDataNoParams("myprocedurename");
Run Code Online (Sandbox Code Playgroud)

要么

GetDataParams("myotherprocedure {0}, {1}, {2}", DateTime.Now, "sometextValue", 12345);
Run Code Online (Sandbox Code Playgroud)

要么

GetDataParams("myotherprocedure var1={0}, var2={1}, var3={2}", DateTime.Now, "sometextValue", 12345);
Run Code Online (Sandbox Code Playgroud)

如果你想调用没有返回值的过程也很容易,因为我确信你可以看到,通过创建一个不存储/返回任何东西的新方法.

灵感来自http://msdn.microsoft.com/en-us/library/bb361109(v=vs.90).aspx.