繁体   English   中英

LINQ-to-SQL中的存储过程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM