Linq to sql C#Linq到SQL存储过程

Linq to sql C#Linq到SQL存储过程,linq-to-sql,stored-procedures,Linq To Sql,Stored Procedures,我有一个返回标量int的存储过程。我使用C#和Linq来获取结果数据,但编译时出现以下错误: foreach语句无法对“int”类型的变量进行操作,因为“int”不包含“GetEnumerator”的公共定义 我的问题是,如果存储过程只返回int,如何获取结果数据。我可以使用datatable和dataset来实现这一点,但我需要在LINQ中实现这一点 下面是一个代码示例: AppDataContext app = new AppDataContext(); var lookup = app.s

我有一个返回标量int的存储过程。我使用C#和Linq来获取结果数据,但编译时出现以下错误:

foreach语句无法对“int”类型的变量进行操作,因为“int”不包含“GetEnumerator”的公共定义

我的问题是,如果存储过程只返回int,如何获取结果数据。我可以使用datatable和dataset来实现这一点,但我需要在LINQ中实现这一点

下面是一个代码示例:

AppDataContext app = new AppDataContext();
var lookup = app.spLookupFrom400(numberType, number);
foreach(lookupResult result in lookup)
{
    ...
}

如果只返回int,为什么要在foreach中迭代结果

假设您有一个Int标记为输出参数,您应该能够执行

AppDataContext app = new AppDataContext();
Int32? lookup = 0;
app.spLookupFrom400(numberType, number, ref lookup);

整数返回真的是必需的还是仅仅返回结果集的真正意图?如果是,请删除整数返回并重新映射存储过程,或将上下文中SP的返回类型映射到适当的对象类型。否则,返回值将是int。

假设您的目的是返回一个结果集,而不仅仅是从存储过程返回整数返回代码,我猜LINQ无法正确确定结果集的类型

检查LINQ到SQL类模块中存储过程的属性。如果LINQ在添加到模块时能够确定结果集类型,则应该显示“(自动生成类型)”。如果不是,它可能会说“整数”

当LINQ尝试获取结果集类型时,如果proc由于某种原因失败,则可能发生这种情况。当proc的结果集从临时表派生时,也可能发生这种情况。如果情况属实,请尝试添加

SET FMTONLY OFF

到你程序的顶端。然后在服务器资源管理器中刷新该进程,然后将该进程删除并重新添加到LINQ to SQL类中以刷新它。

到目前为止的答案忽略了一个事实,即SQL Server存储过程可以生成任意数量的结果集,也可以返回一个值。当然,大多数情况下,它们不会同时执行这两项操作,因此这可能是Linq被SQL绊倒的原因

每当“魔胶代码”(比如Linq到SQL)停止工作时,我总是想办法让它更容易工作


因此,我将尝试编写另一个存储过程,调用麻烦的存储过程,但丢弃标量值。

目的是获取结果集。哦,顺便说一句,我不能修改存储过程。存储过程写得很差,但我无法更改它。我的dbml模块中sp的属性将返回类型标识为“None”,但当我在代码中使用它时,它会认为它是一个int。如果您使用所选查询工具中的给定参数执行存储过程,例如SQL Server Management Studio for MS SQL Server,您会得到什么结果?您是获得标量值(如和整数)还是结果集?我同时获得标量值和结果集。请确保以用于将应用程序连接到数据库的同一用户的身份执行该过程。另外,您是否可以使用SQLServerManagementStudio或“sp_helptext”查看存储过程的文本?如果是,结果是否从临时表返回?