with visual tutorial new net examples vb.net linq

vb.net - visual - tutorial linq vb net



expresiones lambda en vb.net (5)

No he usado VB.NET desde que cambié a C # 3.0, pero parece que podría ser un problema de inferencia de tipo. El error es un poco extraño ya que List implementa IList, por lo que la tarea debería funcionar. Puedes decir "p.ID = 123" para la lambda y las cosas parecen funcionar.

Para cualquier otra persona interesada en investigarlo, aquí hay un código que puede pegar en un nuevo proyecto de consola VB.NET para demostrar este problema:

Module Module1 Sub Main() End Sub End Module Class AccountGroup Public parent_id As Integer Public id As Integer Public sub_account_groups As List(Of AccountGroup) End Class Class AccountRepository Private _repository As AccountRepository Public Function GetAccountGroups() As IList(Of AccountGroup) Dim raw_account_groups As IList(Of AccountGroup) raw_account_groups = _repository.GetAccountGroups().ToList() Dim parents = (From ag In raw_account_groups _ Where ag.parent_id = 0 _ Select ag).ToList() parents(0).sub_account_groups = (From sag In raw_account_groups _ Where sag.parent_id = 0 _ Select sag).ToList() Dim sql_func As Func(Of AccountGroup, List(Of AccountGroup)) = Function(p) _ (From sag In raw_account_groups _ Where sag.parent_id = p.id _ Select sag).ToList() parents.ForEach(Function(p) p.sub_account_groups = sql_func(p)) Return parents End Function End Class

Tengo algo que me está volviendo absolutamente loco ...

Public Function GetAccountGroups() As IList(Of AccountGroup) Dim raw_account_groups As IList(Of AccountGroup) raw_account_groups = _repository.GetAccountGroups().ToList() Dim parents = (From ag In raw_account_groups _ Where ag.parent_id = 0 _ Select ag).ToList() parents(0).sub_account_groups = (From sag In raw_account_groups _ Where sag.parent_id = 0 _ Select sag).ToList() Dim sql_func As Func(Of AccountGroup, List(Of AccountGroup)) = Function(p) _ (From sag In raw_account_groups _ Where sag.parent_id = p.id _ Select sag).ToList() parents.ForEach(Function(p) p.sub_account_groups = sql_func(p)) Return parents End Function

La línea "parents.ForEach (Function (p) p.sub_account_groups = sql_func (p))" tiene este error ...

El operador ''='' no está definido para los tipos ''System.Collections.Generic.IList (Of st.data.AccountGroup)'' y ''System.Collections.Generic.List (Of st.data.AccountGroup)''.

pero realmente no puedo ver cómo es diferente de este código de Rob Connery

public IList<Category> GetCategories() { IList<Category> rawCategories = _repository.GetCategories().ToList(); var parents = (from c in rawCategories where c.ParentID == 0 select c).ToList(); parents.ForEach(p => { p.SubCategories = (from subs in rawCategories where subs.ParentID == p.ID select subs).ToList(); }); return parents; }

que compila perfectamente ... ¿qué estoy haciendo incorrectamente?


La respuesta aceptada aquí probablemente sea incorrecta, basada en tu código. chyne ha dado la pista correcta: las lambdas en VB siempre tienen valores de retorno (a diferencia de C #), sin embargo, en la próxima versión se introducen las lambdas.

Mientras tanto, simplemente no puedes usar este código en VB. Use un bucle regular en su lugar:

For Each p In parents p.sub_account_groups = sql_func(p) Next

La próxima versión de VB (disponible como una versión beta desde ayer) permitiría escribir el siguiente código:

parents.ForEach(Sub (p) p.sub_account_groups = sql_func(p))


Lambda''s en VB.Net tiene que devolver un valor, por lo que su signo igual (''='') se interpreta como una comparación (para que la lambda devuelva un booleano), en lugar de una asignación.


Supongo que ag.parent_id = 0 debería ser Donde ag.parent_id == 0 ?


Use Sub para el operador de asignación:

parents.ForEach(Sub(p) p.sub_account_groups = sql_func(p))