2011-06-16 51 views
6

我在SQL Server数据库中有一个存储过程,它返回结果列表。此存储过程公开在LINQ-to-SQL dbml文件中。然后我尝试调用此存储过程这样:LINQ到SQL中的存储过程

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

谢谢!

+1

请出示代码被用来调用存储过程。 – 2011-06-16 13:11:54

+2

作为一个方面说明:新增列表最初是不必要的(并且浪费),初始列表对象将被GCed。 – BrokenGlass 2011-06-16 13:23:58

回答

4

试试这个,

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; 
} 
} 
+1

这是为什么工作? – 2011-06-16 15:51:34

+0

@Justin:这里VAR隐式地将你的对象转换为欲望类型,编译器会在运行时得到它。你也可以通过做明确的转换来做到这一点,并且在你的代码中你没有定义任何转换... – Syeda 2011-06-17 06:38:41

+0

啊,我明白你在做什么。我被'列表对象=新列表();'在您的原始版本,我认为是不必要的。你实际上可以用'return(列表)context.GetObjectsFromDB();'替换'using'块中的所有内容,它可以正常工作。 – 2011-06-17 13:53:50

0

ISingleResult<T>继承自IEnumerable<T>。只要'T'表示MyObject,您应该可以遍历序列。如果'T'是一个不同的类型,我会在MyObject上放置一个构造函数,它接受数据库类型并从中创建一个MyObject。

您是否尝试过在SPROC调用之后删除断点以查看调试器对于返回的对象所说的内容?

0

可枚举类也有,我通常使用这个ToList成员函数来完成。 http://msdn.microsoft.com/en-us/library/bb342261.aspx

此外,当使用Linq到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并妥善处理错误。

我只提到由于开发应用程序 的经验而导致的额外错误处理,如果您没有附加的错误处理代码,它们可能会崩溃!

0

我知道这是TOOOO晚,但....

从LINQ角度探讨,业务提供商(不使用单结果输出)将返回数据集,所以创造你必须从SP指定返回字段列表:

objects = context.GetObjectsFromDB().Select(x => x.MyObject); 

即由SP返回的字段的名称,如

objects = context.GetObjectsFromDB().Select(x => x.Names); 
0

我有同样的问题!

我的解决办法是翻拍存储过程由表变量替换时态表

DOESN'T AUTO MAP spAA_Result:

CREATE PROCEDURE spAA 
AS 
CREATE TABLE #TABLETMP (ID INT, NAME varchar(50)) 
    ... 
SELECT * FROM #TABLETMP 

AUTO MAP正确的类spBB_Result:

CREATE PROCEDURE spBB 
AS 
DECLARE @TABLETMP AS TABLE (ID INT, NAME varchar(50)) 
    ... 
SELECT * FROM @TABLETMP 
0

是什么将工作如下:

List<string> listOfStrings = dbContext.spMyStoredProc().Select(x => x.Value).ToList<string>(); 

List<int> listOfInts = dbContext.spMyStoredProc().Select(x => x.Value).ToList<int>();