代码之家  ›  专栏  ›  技术社区  ›  Jeff LaFay

可以在LINQPad中使用LINQ调用存储过程吗?

  •  21
  • Jeff LaFay  · 技术社区  · 14 年前

    在visual studio中,有一个很好的设计器,它用一个漂亮的小方法封装了一个存储过程。我非常喜欢LINQPad,并且每天都在工作中使用它(自从我使用它以来,没有必要为我的工作打开SQL Studio!)并希望在使用存储过程时调用它。

    恐怕我知道我自己问题的答案,但我希望也许有一个功能我错过了,或者也许有人有一些黑色魔法,他们可以借给我使这一切发生。顺便说一句,我用的是LINQPad 4如果这有区别的话。

    编辑
    请看下面我的答案。

    5 回复  |  直到 14 年前
        1
  •  25
  •   Daniel Pryden    14 年前

    至少在我的LINQPad副本中,存储过程显示在数据库treeview中,可以直接调用。

    这是一张截图:

    Screenshot

        2
  •  19
  •   Martin Liversage    11 年前

    总结其他一些答案并添加一些附加信息:

    使用 默认(LINQ到SQL) 司机。确保复选框 包括存储过程和函数 已检查。

    在使用连接的查询中,存储过程和函数现在可用作.NET函数(例如C#)。函数所需的参数反映存储过程或数据库函数所需的参数。

    函数返回的值是 ReturnDataSet 它是一种LINQPad类型,从 DataSet . 不幸的是,在数据集上执行LINQ查询并不容易,但是LINQPad提供了扩展方法 AsDynamic() 它将获取返回数据集的第一个表(通常只有一个表),并将行转换为 IEnumerable<Object> 集合中的对象是动态的,允许您作为属性访问列值。E、 g.如果存储过程返回列 Id Name 您可以使用LINQ:

    SomeStoredProc().AsDynamic().Where(row => row.Id == 123 && row.Name == "Foo")
    

    不幸的是,由于行对象是动态的,您将没有intellisense。

        3
  •  9
  •   Jeff LaFay    14 年前

    我的回答 (在丹尼尔的帮助下,谢谢。)

    丹尼尔帮助我认识到,如果在查询窗口中使用下拉列表将数据库作为目标,则可以调用存储过程;然后在查询窗口中按名称调用存储过程,并在末尾附加括号以将其作为函数调用。

    当前版本之间的主要区别(截至目前我使用的是4.26.2)是LINQ in VS返回自定义数据类型以匹配从存储过程返回的数据对象,LINQPad返回一个数据集。因此,通过选择“C#Statement(s)”,您可以成功地将其作为查询运行:

    DataSet fooResults = foo_stored_proc(myParam);
    

    谢谢大家的帮助!

        4
  •  0
  •   user2063329    10 年前

    我正在使用4.51.03版本并连接到SQL Server 2012速成版。连接到AdventureWorks2012数据库后,我可以看到所有存储过程。右键单击存储过程并选择 StoredProceedRename(…)下拉列表 ,将在查询窗口中显示存储过程。您需要在包含省略号的括号内插入参数并运行查询。

    以下两个帖子中给出了示例:

    http://hodentekmsss.blogspot.com/2015/01/learn-querying-sql-server-2012-using.html

    http://hodentekmsss.blogspot.com/2015/01/learn-querying-sql-server-2012-using_25.html

        5
  •  0
  •   Tom Stickel    5 年前

    示例:假设我有一个名为 PersonMatchNoDOBRequired 它希望我把名字和姓氏传过来

    var b = PersonMatchNoDOBRequired("John", "Smith").AsDynamic();
    b.Dump();
    

    如果我想进一步筛选(在我的例子中,我有一个高级的sql算法,它对名字和姓氏进行评分,名字可以返回“Jodi”,但是如果说我真的想进一步筛选它,那么它是这样的:

    var b = PersonMatchNoDOBRequired("John", "Smith").AsDynamic().Where(x => x.FirstName == "John" && x.LastName == "Smith");   
    

    其他答案部分正确-我没有看到任何传入参数(如果需要的话)。

        6
  •  0
  •   MarkTheCoder    5 年前

    使用@jlafay使用的示例,可以从表中获取行并按名称引用列。

    DataSet spItem = sp_StoredProcedure(parameters);
    var rows = spItem.Tables[0].Rows;
    foreach (DataRow row in rows)
    {
       // Do something
       Console.WriteLine($"{row["MyColumn"]}, {row["LastName"]}");
    } 
    
        7
  •  -1
  •   Steve Danner    14 年前

    您只需保存一个对标准ADO.NET对象使用C的查询( SqlConnection , SqlCommand 等)和 Dump() 结果。

    我知道它没有使用LINQ,但它对我很有用。