2009-05-12 10 views
0

logTypeの別個の「logName」項目の文字列配列を取得するためにクエリを実行したいとします。以下はうまくいきます:Linq動的選択キャストの問題

Dim stringArray() As String = (From item In dc.Vw_Logs 
    Where item.LogType = [Passed in logType] 
    Select item.LogName Distinct).ToArray() 

ただし、これは特定のLogTypeが設定されている場合にのみ機能します。 logType句をオプションにしたいと思います。これを試してみて、達成するために、私は、クエリを書き換えています。これにより

Dim q = From item In dc.Vw_Logs Distinct 
If not logType is nothing Then 
    q = q.Where(Function(item) item.LogType = logType) 
End If 
q.Select(Function(item) item.LogName) 
Dim stringArray() As String = q.ToArray() 

を私は次のエラーを取得する:

Value of type '1-dimensional array of Vw_Log' cannot be converted 
to '1-dimensional array of String' 

このラウンドを取得するための最良の方法は何ですか?私は各項目とキャストを反復しないようにしたいと思います。

ありがとうございました

答えて

1

qは文字列ではなく、dc.Vw_Logsに含まれる型であるためです。

私はもうVBで多くのプログラミングをしませんが、これはあなたを閉じるでしょう。

Dim q = From item In dc 
     Where (logType Is Nothing Or item.LogType = logType) 
     Select item.LogName Distinct 


logType Is Nothing Or item.LogType = logType 

logTypeに値がある場合は、一致するアイテムが表示されます。そうしないと、すべてのアイテムが取得されます。

+0

これは機能しません。なぜなら、logType(selectメソッドに渡された)が何もない場合、これは一致しません(この場合はすべて一致します) – James

+1

ジェレミーはあなたのロジックを誤って読んだだけですが、彼は根本的に正しいです。 Where節はちょうど(logTypeは何もないか、item.LogType = logType) –

+0

です。 – Jeremy

0

qを再使用しないでください。最初の割り当てはVw_Log()で、2番目の割り当てはString()です。

これを避けるために最後の2行を組み合わせることもできます。

+0

申し訳ありません - 私はより良いフォーマットに上記のコメントを得ることはできません! – James

+0

これは、内部SQLのSELECT文の結果のようです:=アイテムは異なるdc.Vw_Log で 薄暗いqTyped LOGTYPE <>何も次にqTyped = qTyped.Where(ファンクション(アイテム)item.LogType = LOGTYPE)場合 薄暗いQ = qTyped.Select(Function(item)item.LogName).Distinct() – James

1

問題は、このライン

q.Select(Function(item) item.LogName) 

は、Qは変更されませんが、

Dim stringArray() As String = q.ToArray() 

を行うときは、変換しようとしているように、それは単に選択の結果を捨てるということです元のq(型Vw_Log)を文字列の配列に追加します。最後の2行を次のように置き換えてください:

Dim stringArray() As String = q.Select(Function(item) item.LogName).ToArray()