Linq到sql存储过程不返回结果

时间:2010-07-02 12:42:24

标签: c# sql linq

我有一个Linq to SQL DBML

DBML中包含的是存储过程

当通过Microsoft SQL Server Managment工具执行proc时,它返回60行。

Bu DB并不认为它会返回任何结果。

以前是否有人遇到此问题或知道如何解决?

SP

编辑代码:

[Function(Name="dbo.WQNT_PeekViewNextZone")] 
public int WQNT_PeekViewNextZone([Parameter(Name="Slot", DbType="Int")] System.Nullable<int> slot) 
{ 
  IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), slot); 
  return ((int)(result.ReturnValue)); 
}

这是Linq生成存储过程插入到临时表中然后从proc结尾处的表中选择*的代码

3 个答案:

答案 0 :(得分:2)

当您向设计添加存储过程时,如果不将其拖动到实体上,它会创建默认方式,即返回proc的整数结果。如果您在该过程中完成了任何select语句,则需要将该过程放在设计器中的实体之上,而不是放入方法窗格中,这将允许设计器生成返回IQueryable的适当方法。实体类型,而不是int。

答案 1 :(得分:0)

存储过程的结果应与LINQ模型的现有表完全匹配,或者应将存储过程和结果元素类型添加到dbml文件中。通常,如果您将存储过程放在设计器中的任何位置(而不是放在桌面上),设计人员会为您生成此内容。

您应该查看dbml文件以查看发生的情况。例如,这是我当前项目中dbml文件的一部分:

<Function Name="uspGetDepartments">
  <ElementType Name="uspGetDepartmentsResult">
    <Column Name="ParentDepartmentId" Type="System.Int32" DbType="Int"
            CanBeNull="true" />
    <Column Name="DepartmentId" Type="System.Int32" DbType="Int" CanBeNull="true" />
    <Column Name="DepartmentName" Type="System.String" DbType="NVarChar(200)"
            CanBeNull="true" />
  </ElementType>
</Function>

这意味着我有一个名为uspGetDepartments的存储过程,它返回uspGetDepartmentsResult类型的对象。看一下相应的designer.cs文件,我看到了:

[global::System.Data.Linq.Mapping.FunctionAttribute()]
public ISingleResult<uspGetDepartmentsResult> uspGetDepartments()
{
    IExecuteResult result = this.ExecuteMethodCall(
        this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
    return ((ISingleResult<uspGetDepartmentsResult>)(result.ReturnValue));
}

public partial class uspGetDepartmentsResult
{
    private System.Nullable<int> _ParentDepartmentId;
    private System.Nullable<int> _DepartmentId;
    private string _DepartmentName;

    public uspGetDepartmentsResult() {}

    [global::System.Data.Linq.Mapping.ColumnAttribute(
        Storage="_ParentDepartmentId", DbType="Int")]
    public System.Nullable<int> ParentDepartmentId
    {
        get { return this._ParentDepartmentId; }
        set
        {
            if ((this._ParentDepartmentId != value))
            {
                this._ParentDepartmentId = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(
        Storage="_DepartmentId", DbType="Int")]
    public System.Nullable<int> DepartmentId
    { ... }

    [global::System.Data.Linq.Mapping.ColumnAttribute(
        Storage="_DepartmentName", DbType="NVarChar(200)")]
    public string DepartmentName
    { ... }
}

答案 2 :(得分:0)

我最后采用了简单的方法

剥离存储过程以返回空的临时表

将其删除到linq中,然后添加代码,而不是在select命令

之前运行

不是最好的方式,但它只是一个小项目

由于 为你的帮助人