在visual studio中,你有一个漂亮的设计师用一个漂亮的小方法封装存储过程。我非常喜欢LINQPad并且每天都在工作中使用它(因为我一直在使用它,所以不需要为我的工作打开SQL Studio!)并且想在使用它时调用存储过程。
我害怕我知道自己问题的答案,但我希望可能有一个我缺少的功能,或者也许某人有一些黑魔法,他们可以借此让我这样做。顺便说一句,如果有所不同,我正在使用LINQPad 4.
修改
请参阅下面的答案。
答案 0 :(得分:23)
至少在我的LINQPad副本中,存储过程显示在数据库树视图中,可以直接调用。
以下是截图:
答案 1 :(得分:16)
总结其他一些答案以及添加一些额外信息:
使用默认(LINQ to SQL)驱动程序连接到数据源。确保选中包含存储过程和函数复选框。
现在,在使用连接的查询中,存储过程和函数可用作.NET函数(例如C#)。函数所需的参数反映了存储过程或数据库函数所需的参数。
函数返回的值是ReturnDataSet
,它是从DataSet
派生的LINQPad类型。不幸的是,在数据集上执行LINQ查询并不容易,但LINQPad提供了扩展方法AsDynamic()
,它将获取返回数据集的第一个表(通常只有一个表)并将行转换为{{ 1}}集合中的对象是动态的,允许您将列值作为属性进行访问。例如。如果存储过程返回列IEnumerable<Object>
和Id
,则可以使用LINQ:
Name
不幸的是,你没有intellisense,因为行对象是动态的。
答案 2 :(得分:9)
我的回答(在Daniel的帮助下,谢谢。)
Daniel帮助我意识到,如果使用查询窗口中的下拉列表来定位数据库,则可以调用存储过程。然后在查询窗口中通过其名称调用存储的proc并将括号添加到末尾以将其作为函数调用。
当前版本(我在此日期使用4.26.2)之间的主要区别在于VS中的LINQ返回自定义数据类型以匹配从存储过程返回的数据对象,LINQPad返回DataSet。因此,通过选择“C#Statement(s)”,您可以成功地将其作为查询运行:
DataSet fooResults = foo_stored_proc(myParam);
感谢大家的帮助!
答案 3 :(得分:0)
我正在使用4.51.03版本并连接到SQL Server 2012 Express版。连接到AdventureWorks2012数据库后,我可以看到所有存储过程。右键单击存储过程并选择 StoredProceedureName(...)下拉列表,可以在查询窗口中显示存储过程。您需要在包含省略号的括号内插入参数并运行查询。
示例见以下两篇文章:
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
答案 4 :(得分:0)
示例:假设我有一个名为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");
其他答案部分正确-我没有看到任何传递的参数(如果需要)。
答案 5 :(得分:0)
使用@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"]}");
}
答案 6 :(得分:-1)
您可以使用标准ADO.NET对象(SqlConnection
,SqlCommand
等)和Dump()
结果来保存使用C#的查询。
我意识到它不是在使用LINQ,但它对我很有帮助。