【问题标题】:LINQ on a DataTable IN a CLR Stored ProcedureCLR 存储过程中数据表上的 LINQ
【发布时间】: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; 顺便说一句,AsEnumerableSystem.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


【解决方案1】:

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

首先,我必须准备好加载不安全程序集的数据库。我执行了ALTER DATABASE dbname SET TRUSTWORTHY ON;,然后使用ALTER AUTHORIZATION ON database::dbname TO sa;将数据库的所有者设置为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 实例中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多