[英]Stored Procedures in LINQ-to-SQL
我在SQL Server数据库中有一个存储过程,它返回结果列表。 此存储过程在LINQ-to-SQL dbml文件中公开。 然后我尝试这样调用这个存储过程:
public List<MyObject> GetObjects()
{
List<MyObject> objects = new List<MyObject>();
using (DatabaseDataContext context = new DatabaseDataContext())
{
objects = context.GetObjectsFromDB(); // This is my problem line
}
return objects;
}
我的问题是,我不知道如何将存储过程的结果转换为List<MyObject>
。 context.GetObjectsFromDB
返回System.Data.Linq.ISingleResult<sprocName>
。 如何将存储过程的结果转换为强预定义类型的列表?
谢谢!
试试这个,
public List<MyObject> GetObjects()
{
using (DatabaseDataContext context = new DatabaseDataContext())
{
var objects = context.GetObjectsFromDB();
return new List<MyObject>(objects);
}
}
更新:通过使用显式转换,可以像这样完成
public List<MyObject> GetObjects()
{
using (DatabaseDataContext context = new DatabaseDataContext())
{
List<MyObject> objects = (List<MyObject>)context.GetObjectsFromDB();
return objects;
}
}
我知道现在太晚了......
从LINQ开始,SP(不使用单个结果的输出)将返回DataSet,因此要创建列表,您必须指定SP的返回字段:
objects = context.GetObjectsFromDB().Select(x => x.MyObject);
即SP返回的字段的名称,如
objects = context.GetObjectsFromDB().Select(x => x.Names);
我有同样的问题!
我的解决方案是重制存储过程,用于通过表变量替换时态表
DOESN'T AUTO MAP spAA_Result:
CREATE PROCEDURE spAA
AS
CREATE TABLE #TABLETMP (ID INT, NAME varchar(50))
...
SELECT * FROM #TABLETMP
自动映射正确类spBB_Result:
CREATE PROCEDURE spBB
AS
DECLARE @TABLETMP AS TABLE (ID INT, NAME varchar(50))
...
SELECT * FROM @TABLETMP
是的,工作原理如下:
List<string> listOfStrings = dbContext.spMyStoredProc().Select(x => x.Value).ToList<string>();
要么
List<int> listOfInts = dbContext.spMyStoredProc().Select(x => x.Value).ToList<int>();
ISingleResult<T>
继承自IEnumerable<T>
。 只要'T'代表MyObject,您就应该能够遍历序列。 如果'T'是不同的类型,我会在MyObject上放置一个构造函数,它接受DB类型并从中创建一个MyObject。
您是否尝试在SPROC调用之后删除断点,以查看调试器对您返回的对象的说明?
Enumerable类还有一个ToList成员函数,我通常用它。 http://msdn.microsoft.com/en-us/library/bb342261.aspx
此外,当使用Linq to Sql时,我总是检查结果为null。 如果我需要一个列表,请在转换为列表之前检查计数是否大于零。
public List<MyObject> GetObjects()
{
List<MyObject> objects = null; // no need to "new" here
using (DatabaseDataContext context = new DatabaseDataContext())
{
var tmp = context.GetObjectsFromDB();
if (tmp != null)
{
if (tmp.Count() > 0)
{
objects = (List<MyObject>)tmp.ToList();
}
}
}
return objects;
}
同样,如果您只期望一个结果,请使用
myObject = (MyObject)tmp.ToSingle();
最后,您可能需要考虑将此函数包装在try-catch块中并捕获SqlException并适当地处理错误。
我只提到额外的错误处理,因为开发应用程序的经验如果你没有额外的错误处理代码就会崩溃!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.