在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
循环?
答案 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())) {
//...
}
}