2011-03-24 47 views
3

我在DBML中有一个存储过程,我尝试将结果作为数组(1维数组)传递给“sqlQryArray”。但底部的代码会导致像下面的消息一样的错误还有什么应该做的?LINQ存储过程返回值为字符串数组?

错误1个值类型“aaaDatabase.stp_GetSomethingResult的1维阵列”不能被转换为“字符串的1维阵列”,因为“aaaDatabase.stp_GetSomethingResult”不从“STRING”的。

从存储过程返回的结果是学生的名字(只有一列)

Dim sqlQry = aaaLINQ.stp_GetSomething(bbb,ccc,ddd) 

Dim sqlQryArray As String() = sqlQry.ToArray() 
+0

你可以告诉我们你的存储过程的返回类型是否与你的DBML映射文件一样? – 2011-03-24 15:33:35

+0

这是正确的吗?返回CType(result.ReturnValue,ISingleResult(Of stp_GetSomethingResult)) – Hoorayo 2011-03-24 15:38:06

回答

2

一些背景公正列表
一旦存储过程的结果已经返回,它是转换为实现IEnumerable的ISingleResult,并返回给调用客户端。由于ISingleResult是一个泛型类,因此与存储过程返回的属性相同,将创建与sproc同名的对象。

使用存储过程时,它们只能返回ISingleResult或IMultipleResult类型的项目。这在使用创建的对象时会导致很多问题。首先,在客户端代码中,如果要将对象绑定到数据源,您必须手动将结果转换为像ToList()这样的结果。如果将对象转换为列表,则不会更改跟踪。最后,使用存储过程时,不能从延迟加载中受益,因为调用该方法时会执行对数据库的调用。

在这里阅读完整的文章:http://blog.benhall.me.uk/2008/05/linq-to-sql-stored-procedure-vs.html

入住这也:一个可能的解决方案,您可以立即重新映射的结果你自己的POCO表示。您还可以使用LINQ查询来操纵你的结果:

LINQ to SQL: Stored Procedure Results

+0

这是我没有想到的。感谢这篇文章。 – Hoorayo 2011-03-24 17:52:32

2

从您的存储过程的结果可能是类似这样的事情的记录(POCO C#符号,我希望你能阅读):

class Student { 
    public string Name { get; set; } 
} 

所以声明:

sqlQry.ToArray() 

返回Student对象的数组。如果您只需要名称,请从记录中选择名称:

sqlQuery.Select(student => student.Name).ToArray() 

这将返回一个字符串数组(包含学生名称)。 (对不起C#中的所有例子,我的VB技巧不好,没有智能类型的代码输入)。