【发布时间】:2010-07-06 04:50:01
【问题描述】:
有人知道是否可以(以及如何)在CLR 存储过程中 内的DataTable 上使用LINQ?
但是,我在标准 WinForms 项目中的 DataTable 上使用 LINQ 没有问题;我在 SQL2005 上使用 VS2010 中的数据库项目并创建存储过程:
(简化列表)
[Microsoft.SqlServer.Server.SqlProcedure]
public static void ProcessReOrder()
{
using (SqlConnection conn = new SqlConnection("context connection=true")) {
SqlDataAdapter adapter = new SqlDataAdapter("database.dbo.OtherSp", conn);
DataTable table = new DataTable("ReOrder");
adapter.Fill(table);
var query = from t in table.AsEnumerable()
where t.Field<int>("Id") > 1000 select t.Field<int>("Id");
etc.....
}
问题是,AsEnumerable() 是一种扩展方法,虽然我有 using 对 LINQ 的引用;它仍然没有找到。
搜索 Google,让我相信这与使用框架中隐藏的 LINQ 实体引用 (DLL) 有关,但是,由于这是一个 DB 项目,我们无法添加对任何 DLL 的引用系统;添加参考框仅限于少数几个程序集,并且没有 浏览... 按钮。
不管性能问题等等,我都不想想要在我的 .NET 存储过程中手动滚动大量 ADO/T-SQL;我更喜欢 LINQ 以及将代码移动到不同层/数据库平台的能力。是否支持 Stored Proc 内的 DataTable 上的 LINQ(我猜不支持),还是我在这里完全偏离基础并且必须使用 T-SQL 编码?
【问题讨论】:
-
你为什么不写你自己的
AsEnumerable方法呢?单线:foreach (DataRow r in table.Rows) yield return r;顺便说一句,AsEnumerable在System.Data.DataSetExtensions中。 -
如果您使用像 LINQ-TO-SQL 或实体框架这样的 ORM,您可以添加存储过程并像方法调用一样调用它们。
-
@mquander,我怀疑这将是我唯一的选择。我试图不重新编码 MS 的 LINQ 实现的部分,而是“按原样”使用它——尤其是当代码在 CLR 存储过程之外没有额外的 impl 的情况下工作。你是对的,它不是实体命名空间,而是 System.Data.DataSetExtensions(我的错误),只能从数据库项目中引用该 DLL。看起来 MS 只允许您使用部署在 SQL Server 上的组件。谢谢。
-
@alastair,我们已经在其他层使用 ORM。在这里,我只是想将 C# 和 LINQ(用于对象)而不是 TSQL 用于存储过程。
标签: .net linq stored-procedures clr