2013-06-01 71 views
0

我正在爲我的部門開發一個應用程序。我遇到了一個大問題。Linq中的InvalidCastException實體查詢

我想獲得在ListBox控件上選擇的名稱的主鍵。該表單加載時,該數據庫中的查詢將填充此ListBox控件。以下是用於填充ListBox控件的查詢。

Dim examinationOfficer As New ExamOfficerPayEntities 
Dim findOfficer = From officer In examinationOfficer.Exams_Officer 
Order By officer.First_Name Ascending 
Select officer.First_Name.ToUpper & " " & officer.Last_Name.ToUpper 

lstFullname.DataSource = findOfficer.ToList 
lstFullname.DisplayMember = "FullName" 

該查詢工作正常,並按預期方式填充列表框。問題是我想獲取所選列表框項目的主鍵的值。我試圖檢索的主鍵值是一個整數值,它被設置爲identity

下面是我的數據庫的摘要。

Exam_Officer

Officer_ID as int which is the primary key and is also set as an identity column 
First_Name as nvarchar 
last_Name as nvarchar 

另外一個表是Result_Submitted, 其列:

sn as integer primary key and an identity column 
Officer_ID as an int and is a foreign key to the Table Exam_Officer 
Result_Submitted as nvarchar 
Outstanding_Result as nvarchar 

這是我試圖使用從的SelectedItem財產得到officer_ID代碼Windows窗體的ListBox控件。

Dim selectedOfficer As Exams_Officer = DirectCast(lstFullname.SelectedItem,  Exams_Officer) 
Dim selectedOfficerID As Integer = selectedOfficer.Officer_ID 
The code dosen't work it throws an error on the first line (directcast method) 

System.InvalidCastException was unhandled 
Message=Unable to cast object of type 'System.String' to type 'EXAMINATION_OFFICER_PAYMENT.Exams_Officer'. 
Source=EXAMINATION OFFICER PAYMENT 

我很困惑,不知道還有什麼要做。任何幫助表示讚賞。

回答

1

說實話,我很驚訝它現在甚至顯示爲FullName不是String的財產。看看你的代碼:

Dim examinationOfficer As New ExamOfficerPayEntities 
Dim findOfficer = From officer In examinationOfficer.Exams_Officer 
Order By officer.First_Name Ascending 
Select officer.First_Name.ToUpper & " " & officer.Last_Name.ToUpper 

你正在選擇全名 - 所以你的代碼的結果只是名稱,而不是原來的官員。我懷疑你想要:

Dim examinationOfficer As New ExamOfficerPayEntities 
Dim findOfficer = From officer In examinationOfficer.Exams_Officer 
        Order By officer.First_Name Ascending 

lstFullname.DataSource = findOfficer.ToList 
lstFullname.DisplayMember = "FullName" 

在這一點上,你有一個官員名單,而不是一個字符串列表。假設FullName是你的高級職員的財產。如果不是,您可能想要投影到您在一個屬性中進行字符串連接的列表,但將原始主管人員保留在另一個屬性中。例如:

Dim examinationOfficer As New ExamOfficerPayEntities 
Dim findOfficer = From officer In examinationOfficer.Exams_Officer 
    Order By officer.First_Name Ascending 
    Select New With { 
     .FullName = officer.First_Name.ToUpper & " " _ & officer.Last_Name.ToUpper, 
     .Officer = officer 
    } 

lstFullname.DataSource = findOfficer.ToList 
lstFullname.DisplayMember = "FullName" 

後來的後來,你需要提取Officer屬性的值來獲得在官對象本身。

+0

謝謝先生,我已經完成了你所說的。現在的錯誤是無法投射'VB $ AnonymousType_0'2'類型的對象[System.String,EXAMINATION_OFFICER_PAYMENT.Exams_Officer]'來鍵入'EXAMINATION_OFFICER_PAYMENT.Exams_Officer'。請現在我可以訪問官員對象的所有屬性,但是當我做直播時,它仍然拒絕獲得officer_ID屬性。我是一個noob,在這我仍然在學習。感謝你的所有努力。 –

+0

@JamesOshomah:這表明你實際上並沒有像最後一句中所說的那樣提取「官」屬性。 –

+0

請你能告訴我怎麼去做。老實說我不知道​​該怎麼做。謝謝,願上帝保佑你爲你付出的時間和精力 –

0

通常,執行此操作的方法是將人員添加到ListBox並覆蓋Officer的ToString()方法以返回FullName,或將DisplayMember綁定到Fullname。像喬恩斯基特,我不知道爲什麼你已經張貼工作代碼...

然後,你可以做

Dim selectedOfficer As Exams_Officer = DirectCast(lstFullname.SelectedItem, Exams_Officer) 

Exams_Officer.OfficeID都會好起來的。

此刻你正在給一名軍官施放一個字符串,上面將一個對象施放給一個軍官,這更有可能工作。

但請記住,你需要實例化你所有的官員,他們會記憶。所以如果有很多和/或官員是一個沉重的對象,性能可能會開始受到影響。 當時最簡單的選擇是一個只有ID和名字的小型/結構。