在CLR存储过程中的DataTable上的LINQ

时间:2010-07-06 04:50:01

标签: .net linq stored-procedures clr

是否有人知道在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()是一个扩展方法,虽然我有使用引用LINQ;它还没有找到。

搜索Google,让我相信这与使用隐藏在框架中的LINQ实体引用(DLL)有关,但是,由于这是一个DB项目,我们无法添加对任何DLL的引用系统;添加引用框仅限于少数几个程序集,并且没有浏览... 按钮。

无论性能问题如何,我都不希望在我的.NET存储过程中手动滚动很多ADO / T-SQL;我更喜欢LINQ以及将代码移动到不同层/ DB平台的能力。是否支持存储过程中的DataTable上的LINQ(我猜不是)或者我完全偏离此基础并且必须使用T-SQL进行编码?

1 个答案:

答案 0 :(得分:5)

我不确定这会让你到处都是,但是这会将 System.Data.DataSetExtensions 安装到SQL Server 2008中,以便您可以从SQL CLR项目中引用它。请注意,我是以 sysadmin 固定服务器角色的成员身份登录的。

首先,我必须让数据库准备加载不安全的程序集。我执行ALTER DATABASE dbname SET TRUSTWORTHY ON;然后我将数据库的所有者设置为 sa ALTER AUTHORIZATION ON database::dbname TO sa;

接下来,我通过将文件复制到C:\ Windows \ assembly \ GAC_MSIL \ System.Data.DataSetExtensions \中的保存目录(例如c:\ temp),从工作站上的GAC中提取了程序集的v3.5。 3.5.0.0__b77a5c561934e089。

然后我可以使用语句CREATE ASSEMBLY [System.Data.DataSetExtensions] FROM 'C:\temp\System.Data.DataSetExtensions.dll' WITH PERMISSION_SET = UNSAFE;安装程序集。

语句完成后,您将收到此友好提醒:警告:Microsoft .NET Framework程序集'system.data.datasetextensions,version = 3.5.0.0,culture = neutral,publickeytoken = b77a5c561934e089,processorarchitecture = msil “。您正在注册未在SQL Server托管环境中进行全面测试,并且不受支持。将来,如果升级或维护此程序集或.NET Framework,则CLR集成例程可能会停止工作。有关详细信息,请参阅SQL Server联机丛书。

此时,我可以在我的SQL CLR项目中引用 System.Data.DataSetExtensions ,并确认AsEnumerable()出现在DataTable实例上。