2011-09-13 32 views
0

,這是什麼的正確語法:正確的語法LINQ查詢只選擇某些列

Dim qry As <??> = From f In dirInfo.GetFiles("*.QBW") Select File = f.FullName, Include = True 
Dim dt As DataTable = qry.CopyToDataTable() 

我試圖爲「IEnumerable的(中DataRow中)」,但沒有奏效。在運行時,它表示:

無法轉換 類型 'WhereSelectArrayIterator 2[System.IO.FileInfo,VB$AnonymousType_0 2 [System.String,System.Boolean]]' 鍵入 「System.Collections.Generic.IEnumerable`1 [系統的對象。 Data.DataRow]」。

+0

whats in dirInfo? –

+1

@Trikks,根據用法,這將是'System.IO.DirectoryInfo'的一個實例。 –

+0

@Anthony是正確的,dirInfo是「System.IO.DirectoryInfo」 – Denis

回答

2

我嘗試在大多數情況下應用Linq,所以我更熟悉它,但這似乎並不是使用它的正確問題。因此,回到過去和真實的方式...每個人的幫助下,我到達的最佳方式是:

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 
-1

解決方法是在您粘貼的錯誤消息中...您需要一個IEnumerable(Of FileInfo)

+0

這是不正確的。 qry不是'FileInfo',有一個匿名類型。 –

+0

錯誤信息絕對不會*說*。 '選擇'正在創建一個動作類型的新實例。 – dlev

+0

我會假設它是一個IEnumerable(Of DataRow),其中每個DataRow包含2列:「文件」和「包含」。我該如何解決這個問題? – Denis

1
Dim qry = dirInfo.GetFiles("*.QBW").[Select](Function(f) New With { _ 
    f.FullName, _ 
    .Include = True _ 
}) 
+0

,但後來我不能做qry.CopyToDataTable()?什麼類型是「qry」? – Denis

+0

qry是一個IEnumerable(匿名類型)。如果需要顯式類型,則聲明包含2個屬性FullName和Include的新類。 –

+0

在這種情況下,您不能使用CopyToDataTable。請參閱http://msdn.microsoft.com/en-us/library/5ycd1034(v=vs.80).aspx#Y662向表中添加行 –

1

或者簡單地把Option Infer On,並且不使用任何東西,像

Dim qry = From f In dirInfo.GetFiles("*.QBW") Select File = f.FullName, Include = True 

看看here在深入討論更。

但是,要使用CopyToDataTable()該類型需要DataRow派生類型。
你打算如何使用DataTable,在.net中有很多地方不需要DataTable?

+0

qry的正確類型是什麼?因爲我似乎無法做到qry.CopyToDataTable()... – Denis

+1

這是一個匿名類型。編譯器創建並維護它,併爲其提供系統生成的名稱(WhereSelectArray ...]]部分)。 – SWeko

2

下面是一個小的解決方案C#編寫的

使用SELECT(X =>新{})...,然後鍵入它爲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

現在,作爲清楚s ^在問題中,打字不清楚,這可以通過使用IEnumerable來解決。但是,這不是一個最佳的解決方案,而是我建議構建一個對象並將數據存儲在那裏。但對於次要的應用程序,我想它會做。

+0

-1將C#答案發布到VB.NET問題。此外,使用類型推斷(通過使用'var'關鍵字)迴避了所問的實際問題。第三,在我看來(但我不是100%肯定的),你已經改變了使用'new {...}'的代碼的含義。 – stakx

+1

好吧,當我編寫我的答案時,它被標記爲C#,因此我認爲在c#中輸入它是可以的......但是我已經用vb.net版本更新了這個帖子,所以每個人都會像彩虹一樣快樂。建議使用Var關鍵字,因爲.net4,你住在什麼岩石下?這篇文章的意思是通過使用linq來選擇幾個特定的​​列,並且我已經完成的方式是我知道的唯一方法。哦,請告訴我們在批評之前你想怎麼做。 –

+1

這是作爲跨C#/ VB.NET發佈的,因爲我不關心哪種語言的答案會在。正在尋找這個想法。用-1標記C#答案不公平。 @Trikks,感謝您將其更改爲VB.NET,儘管沒有必要。 – Denis