17

我正在开发一个需要使用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();
}

该代码有效,但他们希望我创建一种方法,该方法将返回我告诉它运行的任何存储过程。我在网上搜索并与同事讨论过这个问题,但未能找到一种方法来创建可重用的存储过程类。

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

编辑:

我正在寻找的是是否有办法执行以下操作?

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"
);

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

4

3 回答 3

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();
}

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

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

于 2012-06-05T17:10:07.783 回答
2

对您的问题的最简单答案是,您可以像在 ADO.Net 中一样获取您的Connection属性MyDataContext并创建和执行您自己的 s。SqlCommand我不确定这是否符合您的目的,特别是如果您想从 LINQ to SQL 模型中检索实体。

如果您想从模型中返回实体,请查看该DataContext.ExecuteCommand方法。

于 2012-05-30T19:29:31.167 回答
0

当我们在 .dbml 文件中删除 Table 或 StoredProcedure 时,它​​会创建它的类,该类与数据层和我们的业务逻辑进行通信。

在 Linq to SQL 中,我们必须在 .dbml 文件中存在 StoredProcedures 或表,否则无法在 Linq to SQL 中调用通用方法,通过将存储过程的名称传递给方法来调用存储过程。

但是在 ADO.Net 中我们可以做到(就像你知道的那样)

SqlCommand cmd = new SqlCommand("myStoredProc", conn);
于 2012-06-07T12:22:22.073 回答