LINQ to-SQL 中的存储过程
本文关键字:存储过程 to-SQL LINQ | 更新日期: 2023-09-27 17:59:13
我在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;
}
}
ISingleResult<T>
继承自IEnumerable<T>
。 只要"T"代表 MyObject,就应该能够遍历序列。 如果"T"是不同的类型,我会在MyObject上放置一个构造函数,该构造函数采用数据库类型并从中创建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 并适当地处理错误。
由于开发应用程序的经验,我只提到额外的错误处理如果您没有额外的错误处理代码,可能会崩溃!
为时已晚,但是....
从 LINQ 感知来看,SP(不使用单个结果的输出(将返回数据集,因此要创建列表,您必须指定从 SP 返回的字段:
objects = context.GetObjectsFromDB().Select(x => x.MyObject);
即 SP 返回的字段名称,例如
objects = context.GetObjectsFromDB().Select(x => x.Names);
我遇到了同样的问题!
我的解决方案是重新制作存储程序,用表变量替换临时表
不会自动映射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>();