【问题标题】:Foreach datarow filter in BIMLBIML 中的 Foreach 数据行过滤器
【发布时间】:2015-02-10 15:23:09
【问题描述】:

在 BIML 文件中工作时,我有 2 个 DataTables,我通过带有 SQL 查询的 ExternalDataAccess.GetDataTable 调用来填充它们。我在另一个内部循环,并试图通过从外部值过滤内部值来将 2 连接在一起。

我通过编写以下代码解决了这个问题:

foreach (DataRow t in Target.Rows) {
    foreach (DataRow c in Columns.Rows) {
        if (c["Object"].ToString() == t["ReferenceObject"].ToString()) {
            //...
        }
    }
}

但是,我认为有一种方法可以过滤内部 foreach 循环。我可能在DataSet内部有1000条记录,这就是我缺乏经验的地方。

foreach (DataRow t in Target.Rows) {
   foreach (DataRow c in Columns.Rows.Where(z => z["Object"].ToString() == t["ReferenceObject"].ToString())) {
       //...
   }
}

我收到一个错误:'System.Data.DataRowCollection' 不包含“Where”的定义并且没有扩展名*...我知道这是无效的,但这基本上就是我想要做的。有没有办法根据外部foreach 循环中的值过滤内部foreach 循环?

【问题讨论】:

    标签: c# linq foreach filter biml


    【解决方案1】:

    要枚举表的 DataRows,您需要将 AsEnumerable 扩展名应用于 DataTable

    foreach(DataRow row in Columns.AsEnumerable()
                    .Where(z => z.Field<string>("Object") == 
                                t.Field<string>("ReferenceObject"))
     ......
    

    但是,如果可能的话,我想探索在数据集级别使用DataRelation 连接两个表的可能性。

    Here an MSDN example 关于如何导航您已为其建立DataRelation 的两个表的父/子记录

    【讨论】:

    • 这似乎对我不起作用('System.Data.DataTable' 不包含'AsEnumerable' 的定义......)。我应该提到我正在尝试通过 BIML 文件中的 C# 代码块来完成此操作。另外,我只导入 System.Data 命名空间。
    • 什么框架版本?数据表的 AsEnumerable 扩展可以在 System.Data.DataSet.Extensions 中找到。见这里stackoverflow.com/questions/3949302/…
    • 对不起,我对这一切都不熟悉...如何确定框架版本?我正在使用带有 BIDS Helper 加载项的 VS2012。我尝试添加 System.Data.DataSetExtensions 命名空间,但收到错误消息“命名空间 'System.Data' 中不存在类型或命名空间名称 'DataSetExtensions'。
    • 该程序集被命名为 System.Data.DataSetExtensions,您可以发现它为您的项目添加了一个新的引用并在 Assembly->Framework 选项卡中查看。无需添加 using,因为程序集的命名空间设置为 System.Data。可以通过查看项目应用程序页面、目标框架组合的属性轻松找到该框架。
    【解决方案2】:

    AsEnumerable 和 Field 来自 System.Data.DataExtensions 程序集,因此您需要在 BIML 文件中添加对它的引用,此外您还需要导入 System.Data 以使命名空间在您的 BIML 代码中可用.

    例如

    <#@ assembly name="System.Data.DataSetExtensions" #>
    <#@ import namespace="System.Data" #>
    

    注意:我没有在上面指定完全限定的程序集名称,以保持示例简单。

    但是,如果您的机器上有 >1 个版本的 .NET 框架,则需要使用程序集的完全限定名称(以便 BIML 知道要使用哪个版本)。

    您可以找到使用 gacutil 安装的程序集的完全限定名称。

    启动命令提示符并导航到 Visual Studio 安装位置中的 VC 目录(例如 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC)。

    然后输入:

    gacutil /l <assembly name>
    

    这将返回已安装程序集的每个版本的完全限定名称。在我的机器上有 .NET 3.5 和 4.0 版本,我选择在我的 BIML 中使用最新版本:

    System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL
    

    【讨论】:

      【解决方案3】:

      感谢@thesarahryan,我想通了,只是没有在这里发帖。我不得不将“Rows”更改为“Select()”...

      foreach (DataRow t in Target.Rows) {
         //foreach (DataRow c in Columns.Rows.Where(z => z["Object"].ToString() == t["ReferenceObject"].ToString())) {
         foreach (DataRow c in Columns.Select().Where(z => z["Object"].ToString() == t["ReferenceObject"].ToString())) {
             //...
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 2013-01-16
        • 2013-08-01
        • 2019-03-29
        • 2016-06-06
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多