CoderWil Ответов: 2

Linq to a custom data error


Я пытаюсь получить новый набор данных в предопределенном словаре данных, однако я сталкиваюсь с сообщением об ошибке в "Return Result.tolist()"

"Ошибка BC30311 значение типа' List(Of S_pocontRepo.postatus)' не может быть преобразовано в 'S_pocontRepo.postatus'."


Structure postatus
    Public po_no As String
    Public po_date As String
    Public crcode As String
    Public name As String
    Public qty As Decimal
    Public qty_rec As Decimal
    Public os_qty As Decimal
    Public dt_due As DateTime
    Public status As String
    Public rowid As Integer
End Structure

''Note
''The EXT.NET Grid Store cannot accept EF List as datasource so we need to use LindQ.
''
Public Function GetPOStatusByLinQ(ByVal inPartcode As String) As postatus '' List(Of postatus)
    ''LinQ
    ''-----------------------------------------------------------------------------------------------
    Dim result = From p In Db.s_pocont
                 Group Join c In Db.s_apmaster On c.crcode Equals p.crcode Into podtl_ap = Group
                 From c In podtl_ap.DefaultIfEmpty()
                 Group Join h In Db.s_pohdr On h.po_no Equals p.po_no Into podtl_hdr = Group
                 From h In podtl_hdr.DefaultIfEmpty()
                 Where p.part_code = inPartcode And
                     h.status <> "CANCELLED" And
                     h.status <> "COMPLETED" And
                     p.type <> "D" And
                     p.os_qty > 0
                 Select New postatus With {
                    .po_no = p.po_no,
                    .po_date = h.date,
                    .crcode = p.crcode,
                    .name = c.name,
                    .qty = p.qty,
                    .qty_rec = p.qty_rec,
                    .os_qty = p.os_qty,
                    .dt_due = p.dt_due,
                     .status = h.status,
                     .rowid = p.rowid
                  }

    Return result.ToList()

End Function


Что я уже пробовал:

Я замечаю
IEnumerable
тип данных не может быть преобразован в "List< of" в VB.net и именно поэтому я попытался обойти этот метод. и все же мы зашли в тупик.

Как я могу решить эту проблему?
ТИА

2 Ответов

Рейтинг:
8

Maciej Los

Я бы посоветовал прочитать это: Значение типа '< type1> ' не может быть преобразовано в '< type2>'[^]
Это может помочь вам понять, что вы делаете неправильно.

Что касается вашего другого вопроса (в комментарии к решению №1):

Цитата:
Когда я переоденусь в List(of postatus), сообщение об ошибке показывает "
An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code<br />
Additional information: Only parameterless constructors and initializers are supported in LINQ to Entities.
"


Это сообщение об ошибке отображается, когда Entity Framework не знает, как перевести Linq Select() оператор в SQL-выражение. Если вам нужно выполнить преобразование данных в POCO, который не является сущностью, вы должны сначала получить соответствующие данные из EF, а затем преобразовать их в POCO, например:

Public Function GetPOStatusByLinQ(ByVal inPartcode As String) As List(Of postatus)
    ''LinQ
    ''-----------------------------------------------------------------------------------------------
    Dim EfResult = (From p In Db.s_pocont
                 Group Join c In Db.s_apmaster On c.crcode Equals p.crcode Into podtl_ap = Group
                 From c In podtl_ap.DefaultIfEmpty()
                 Group Join h In Db.s_pohdr On h.po_no Equals p.po_no Into podtl_hdr = Group
                 From h In podtl_hdr.DefaultIfEmpty()
                 Where p.part_code = inPartcode And
                     h.status <> "CANCELLED" And
                     h.status <> "COMPLETED" And
                     p.type <> "D" And
                     p.os_qty > 0) _
                 .ToList() 'this causes the query to execute

     'now, you can return POCO model
     Dim PocoResult = (From efr In EfResult
                 Select New postatus With {
                    .po_no = p.po_no,
                    .po_date = h.date,
                    .crcode = p.crcode,
                    .name = c.name,
                    .qty = p.qty,
                    .qty_rec = p.qty_rec,
                    .os_qty = p.os_qty,
                    .dt_due = p.dt_due,
                     .status = h.status,
                     .rowid = p.rowid
                  }) _
                  .ToList()

    Return PocoResult

End Function


Для получения дополнительной информации, пожалуйста, смотрите:
Работа с сущностями POCO[^]


Рейтинг:
2

F. Xaver

Ну, в вашем объявлении функции вы говорите, что возвращаетесь postatus,
но в вашем коде вы вернуть List(Of postatus)
вот что говорит вам сообщение об ошибке ..

как вы можете решить эту проблему?

измените свой код, чтобы вернуть один postatus ... если Ваш запрос возвращает только 1 элемент и вы уверены в этом, то .Single будем делать..


CoderWil

Спасибо, Ксавер, за твой ответ.

Результат содержит более 1 записи. Я пытался как postatus' и 'список(postatus) в объявлении функции, но не повезло.

Когда я переключаюсь на List (of postatus), сообщение об ошибке показывает "исключение типа 'System.Исключение notsupportedexception', происходящие в системе.Данных.Лица.dll, но не был обработан в пользовательском коде
Дополнительная информация: в LINQ to Entities поддерживаются только непараметрические конструкторы и инициализаторы."

F. Xaver

Я не знаком с EntityFramework :(
maybee изменить postatus из структуры в класс с пустым Sub New () может помочь.. но, как уже было сказано, Я не использую Entity

но я вижу 2 варианта для вас
- Измените GetPOStatusByLinQ, чтобы возвращать только один объект postatus
- Или измените везде, где вы используете GetPOStatusByLinQ, чтобы он поддерживал список (postatus) (только если идея класса работает)