1

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

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

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

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

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循环?

4

3 回答 3

2

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

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

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

这里有一个 MSDN 示例,介绍如何导航您已为其建立的两个表的父/子记录DataRelation

于 2015-02-10T15:32:12.307 回答
1

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

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())) {
       //...
   }
}
于 2016-01-18T15:38:30.157 回答
1

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
于 2016-01-16T10:27:16.470 回答