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

时间:2012-05-30 19:17:26

标签: c# linq linq-to-sql ado.net

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

我已审核了Linq To Sql上的MSDN docs,这些内容正在显示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执行的过程名称的字符串值

3 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:2)

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

如果您想从模型中返回实体,请查看Connection方法。

答案 2 :(得分:0)

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

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

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

SqlCommand cmd = new SqlCommand("myStoredProc", conn);