Свойство SelectedValue объекта ListBox возвращает неправильное значение, когда оно связывается с результатом запроса Linq to Entity. - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу заполнить список с помощью запроса Linq To Entities.Проблема в том, что свойство SelectedValue возвращает неправильное значение!

Это процесс:

1. Заполните поле списка:

Dim FirstLevelList = (From FL In db.FirstLevels
                  Where FL.Department.Id = UserDepartment.Id
                  Select New With {
                     .Value = FL,
                     .Display = FL.Title
                  }).ToList
LstFirstLevel.DataSource = FirstLevelList
LstFirstLevel.DisplayMember = "Display"
LstFirstLevel.ValueMember = "Value"

2. Преобразуйте SelectedValue вОбъект FirstLevel:

Dim SelectedFirstLevel = CType(LstFirstLevel.SelectedValue, FirstLevel)

Но существует ошибка преобразования во время выполнения:

System.InvalidCastException: 'Невозможно привести объект типа' VB $ AnonymousType_0`2 [Coding_Generator.FirstLevel, System.String] 'для ввода' Coding_Generator.FirstLevel '.'

И это содержимое LstFirstLevel.SelectedValue: enter image description here

Но это должен быть только индекс .Value, а не весь объект {.Display, .Value}!

1 Ответ

0 голосов
/ 29 ноября 2018

Исходя из сообщения об исключении, свойство LstFirstLevel.DataSource имеет анонимный тип, обозначенный Select New With без упоминания какого-либо имени класса для проецирования в список.

Попробуйте создать класс-заполнитель, который содержит свойства Value и Display с соответствующими типами:

Public Class Placeholder

    Public Property Value As FirstLevel
    Public Property Display As String

End Class

Затем вы должны использовать Select, указав имя класса для включения приведения:

Dim FirstLevelList = (From FL In db.FirstLevels
                      Where FL.Department.Id = UserDepartment.Id
                      Select New Placeholder With {
                         .Value = FL,
                         .Display = FL.Title
                     }).ToList

LstFirstLevel.DataSource = FirstLevelList

И измените приведение следующим образом:

Dim SelectedListValue = CType(LstFirstLevel.SelectedValue, Placeholder)

Dim SelectedFirstLevel = CType(SelectedListValue.Value, FirstLevel)

Ссылка: Возврат результата запроса LINQ в виде определенного типа

...