这个的正确语法是什么:
Dim qry As <??> = From f In dirInfo.GetFiles("*.QBW") Select File = f.FullName, Include = True
Dim dt As DataTable = qry.CopyToDataTable()
我试过“IEnumerable(Of DataRow)”但是没有用。在运行时它说:
无法投射类型的对象 'WhereSelectArrayIterator
2[System.IO.FileInfo,VB$AnonymousType_0
2 [System.String,System.Boolean]]' 输入 'System.Collections.Generic.IEnumerable`1 [的System.Data.DataRow]'。
答案 0 :(得分:2)
这是一个用c#
编写的小解决方案使用select(x =&gt; new {})...并将其输入为IEnumerable
private static void Main(string[] args)
{
var dirInfo = new DirectoryInfo(@"c:\windows\temp\");
IEnumerable<dynamic> qry = dirInfo.GetFiles("*.txt").Select(x => new { x.FullName, x.Extension });
foreach (var item in qry)
{
Console.WriteLine(string.Concat(item.Extension, " -> ", item.FullName));
}
Console.ReadKey();
}
编辑,这是一个vb版本
Private Shared Sub Main(args As String())
Dim dirInfo = New DirectoryInfo("c:\windows\temp\")
Dim qry As IEnumerable(Of dynamic) = dirInfo.GetFiles("*.txt").[Select](Function(x) New From { _
x.FullName, _
x.Extension _
})
For Each item As var In qry
Console.WriteLine(String.Concat(item.Extension, " -> ", item.FullName))
Next
Console.ReadKey()
End Sub
更新2
现在正如问题中明确指出的那样,打字不清楚,这可以通过使用IEnumerable来解决。但是,这不是最佳解决方案,相反,我建议构建一个对象并将数据存储在那里。但对于次要应用,我认为它会这样做。
答案 1 :(得分:2)
我尝试在大多数情况下应用Linq,所以我对它更熟悉,但这似乎不是正确的问题。所以回到过去的真实方式...... Per Everyone的帮助,我到达时,最好的办法是:
Dim dt As New DataTable()
dt.Columns.Add("File", GetType(String))
dt.Columns.Add("Include", GetType(Boolean))
For Each f as FileInfo In dirInfo.GetFiles("*.QBW")
dt.Rows.Add(f.FullName, True)
Next
答案 2 :(得分:1)
Dim qry = dirInfo.GetFiles("*.QBW").[Select](Function(f) New With { _
f.FullName, _
.Include = True _
})
答案 3 :(得分:1)
或者只需转动Option Infer On
,不要使用任何内容,例如
Dim qry = From f In dirInfo.GetFiles("*.QBW") Select File = f.FullName, Include = True
请查看here进行更深入的讨论。
但是,要使用CopyToDataTable(),类型需要DataRow派生类型 您打算如何使用DataTable,.net中有很多地方不需要DataTable?
答案 4 :(得分:-1)
解决方案在您粘贴的错误消息中...您需要IEnumerable(Of FileInfo)
。