如何使用Linq to SQL从存储过程中检索多行?

如何使用Linq to SQL从存储过程中检索多行?,sql,linq,linq-to-sql,stored-procedures,Sql,Linq,Linq To Sql,Stored Procedures,我最近开始使用Linq to SQL,并想知道如何通过执行存储过程获得多行,下面是一个简单的sp: CREATE PROCEDURE gsp_ftsmultiple @SearchKey varchar(100) AS BEGIN SET NOCOUNT ON; SELECT Label, theContent FROM FtsTest WHERE FREETEXT( theContent, @SearchKey ) END 从management stu

我最近开始使用Linq to SQL,并想知道如何通过执行存储过程获得多行,下面是一个简单的sp:

CREATE PROCEDURE gsp_ftsmultiple
  @SearchKey varchar(100)
AS

BEGIN

  SET NOCOUNT ON;

  SELECT Label, theContent 
    FROM FtsTest 
   WHERE FREETEXT( theContent, @SearchKey )

END

从management studio执行此sp很好,但生成的上下文类中的相应方法返回int值,我不知道如何获取实际行,尝试使用OUT参数,但它们只能返回一个结果。

您最好只运行查询本身,因为你没有真正做任何需要程序的事情。只需确保正确转义搜索键。

您最好只运行查询本身,因为您并没有真正执行任何需要过程的操作。只需确保正确转义搜索键。

尝试将全文谓词创建为包装函数,而不是存储过程,如。为我工作。

尝试将全文谓词创建为包装函数,而不是存储过程,如。为我工作。

我认为您需要做的就是创建一个与结果模式匹配的类,并确保dbml中的函数将其作为返回类型


请参见msdn上的

我认为您需要做的就是创建一个与结果模式匹配的类,并确保dbml中的函数将其作为返回类型


请参见msdn上的当
sqlmetal
生成此过程的代码时,它不会传递有效参数以使查询正常工作

尝试在SP顶部放置类似的内容:

IF @SearchKey IS NULL OR LEN(@SearchKey) = 0
BEGIN
    SELECT N'' AS Label, N'' AS theContent WHERE 1 = 0
END

[...]
现在可以推断2个NVARCHAR列是通常的输出,并相应地生成代码

还有,我头上的代码,未经测试


Mike

sqlmetal
生成此过程的代码时,它不会传递有效参数以使查询正常工作

尝试在SP顶部放置类似的内容:

IF @SearchKey IS NULL OR LEN(@SearchKey) = 0
BEGIN
    SELECT N'' AS Label, N'' AS theContent WHERE 1 = 0
END

[...]
现在可以推断2个NVARCHAR列是通常的输出,并相应地生成代码

还有,我头上的代码,未经测试


Mike

我测试了下面的代码片段,效果很好。如果您将生成的代码放在这里,我可以查看并检查问题出在哪里。无论如何,您可以创建一个与生成的数据上下文类同名的分部类,并手动添加所需的方法,如下所示

public partial class FooDataContext: System.Data.Linq.DataContext
{

    [System.Data.Linq.Mapping.Function(Name = "GetFoo")]
    public System.Data.Linq.ISingleResult<Foo> GetFoo()
    {
        System.Data.Linq.IExecuteResult res = base.ExecuteMethodCall(this, (System.Reflection.MethodInfo)System.Reflection.MethodInfo.GetCurrentMethod());
        return (System.Data.Linq.ISingleResult<Foo>)res.ReturnValue;
    }

}
公共部分类FooDataContext:System.Data.Linq.DataContext
{
[System.Data.Linq.Mapping.Function(Name=“GetFoo”)]
public System.Data.Linq.ISingleResult GetFoo()
{
System.Data.Linq.IExecuteResult res=base.ExecuteMethodCall(this,(System.Reflection.MethodInfo)System.Reflection.MethodInfo.GetCurrentMethod());
return(System.Data.Linq.ISingleResult)res.ReturnValue;
}
}

我测试了以下代码片段,效果很好。如果您将生成的代码放在这里,我可以查看并检查问题出在哪里。无论如何,您可以创建一个与生成的数据上下文类同名的分部类,并手动添加所需的方法,如下所示

public partial class FooDataContext: System.Data.Linq.DataContext
{

    [System.Data.Linq.Mapping.Function(Name = "GetFoo")]
    public System.Data.Linq.ISingleResult<Foo> GetFoo()
    {
        System.Data.Linq.IExecuteResult res = base.ExecuteMethodCall(this, (System.Reflection.MethodInfo)System.Reflection.MethodInfo.GetCurrentMethod());
        return (System.Data.Linq.ISingleResult<Foo>)res.ReturnValue;
    }

}
公共部分类FooDataContext:System.Data.Linq.DataContext
{
[System.Data.Linq.Mapping.Function(Name=“GetFoo”)]
public System.Data.Linq.ISingleResult GetFoo()
{
System.Data.Linq.IExecuteResult res=base.ExecuteMethodCall(this,(System.Reflection.MethodInfo)System.Reflection.MethodInfo.GetCurrentMethod());
return(System.Data.Linq.ISingleResult)res.ReturnValue;
}
}

FYI:最好留作评论。感谢您的回复,但由于我想使用全文搜索,而且Linq to SQL不直接支持此功能,因此我必须使用sp。请参阅我的答案,这是因为FREETEXT()Visual Studio调用SP并尝试生成LINQ 2 SQL代码时失败。仅供参考:最好留作评论。感谢您的回复,但由于我想使用全文搜索,并且LINQ to SQL不直接支持此功能,因此我必须使用SP。请参阅我的回答,这是因为FREETEXT()Visual Studio调用SP并尝试生成LINQ 2 SQL代码时失败。谢谢,也是db的新手,不太了解您,但我会尝试解决它。谢谢,也是db的新手,不太了解您,但我会尝试解决它。