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