2009-05-12 1 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 절이 선택적 이길 원합니다. 시도하고 내가 쿼리 재 작성 한이 달성하기

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

이 피해 갈 수있는 가장 좋은 방법은 무엇입니까 : 나는 다음과 같은 오류가이와

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() 

를? 각 항목을 반복하여 캐스팅하지 않으려합니다.

도움을 주셔서 감사합니다.

답변

1

q가 문자열이 아니고 dc.Vw_Logs에 포함 된 유형이기 때문에 오류가 발생합니다.

VB에서 프로그래밍을 더 이상하지 않지만이 문제를 해결해야합니다. LogType의이 값이있는 경우

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 

, 당신은 일치하는 항목을 얻을 것이다; 그렇지 않으면 모든 항목을 가져옵니다.

+0

logType (select 메소드에 전달됨)이 아무 것도 없으면 일치가 발생하지 않으므로 작동하지 않습니다 (이 경우 모든 일치를 원합니다.) – James

+1

Jeremy는 논리를 잘못 읽었지만 근본적으로 정확합니다. Where 절은 그냥 있어야합니다 (logType은 Nothing 또는 item.LogType = logType) –

+0

catch를 주셔서 감사합니다. – Jeremy

0

q를 다시 사용하지 마십시오. 첫 번째 할당은 Vw_Log()이고, 두 번째 할당은 String()입니다.

마지막 두 줄을 결합하여이를 방지 할 수도 있습니다.

+0

죄송합니다. 더 좋은 형식으로 위의 의견을받을 수 없습니다. – James

+0

이 내부 SQL 선택 문이 발생할 것으로 보인다 : 희미한 qTyped = dc.Vw_Log에서 항목을 구별 하면 LogType의 <> 아무것도 그런 qTyped = qTyped.Where (기능 (항목) item.LogType = LogType의) 희미한 Q = qTyped.Select (Function (item) item.LogName) .Distinct() – James

1

문제는

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

이 질문을 변경하지 않습니다 , 단순히 선택의 결과를 폐기이 줄 것입니다 그래서 당신은

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

을 수행 할 때 당신은 변환하려는 것을 원래 q (Vw_Log 유형 임)를 문자열 배열에 추가합니다. 마지막 두 줄을 다음으로 바꿉니다.

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