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>。如何将存储过程的结果转换为强预定义类型的列表?

谢谢!

LINQ to-SQL 中的存储过程

试试这个,

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