BIML中的Foreach数据路由器过滤器

时间:2015-02-10 15:23:10

标签: c# linq foreach filter biml

在BIML文件中工作,我通过DataTables调用SQL查询来填充2 ExternalDataAccess.GetDataTable。我在另一个内部循环,我正试图“绑定”#39;通过对外部的值过滤内部的一个来共同使用。

我通过编写以下内容来解决这个问题:

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

3 个答案:

答案 0 :(得分:1)

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

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

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

Here an MSDN example关于如何浏览已为其建立DataRelation

的两个表的父/子记录

答案 1 :(得分:0)

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

E.g。

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

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

但是,如果您的计算机上有&gt; 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

答案 2 :(得分:0)

谢谢@thesarahryan,我想出来了,就是没有回复这里。我不得不改变&#34; Rows&#34;到&#34;选择()&#34; ...

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())) {
       //...
   }
}