我正在开发一个需要使用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
执行的过程名称的字符串值
答案 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);