2011-04-12 17 views
6

estoy en el proceso de enseñar a mí C# mediante la conversión de un proyecto existente y estoy atascado convertir el siguiente código vb LINQ:conversión de VB LINQ a C#

Dim outStuff = From tt In (From t In Products.SelectMany(Function(p) If(p.tags IsNot Nothing, p.tags, New ObservableCollection(Of TagModel))) 
       Group By tagName = t.name, 
            v = (Aggregate p In Products Where If(p.tags IsNot Nothing, p.tags.Contains(t), Nothing) Into Sum(p.views)), 
            nl = (Aggregate p In Products Where If(p.tags IsNot Nothing, p.tags.Contains(t), Nothing) Into Sum(p.num_likes)) 
       Into g = Group, Count()) 
       Group By name = tt.tagName Into Count = Sum(tt.Count), viewsTotal = Sum(tt.v), num_likesTotal = Sum(tt.nl) 
       Select name, Count, viewsTotal, num_likesTotal 

donde Products As ObservableCollection(Of ProductModel)

He mananged para convertir esto hasta ahora:

var x = Products.SelectMany(p => (p.tags != null) ? p.tags : new ObservableCollection<TagModel>()); 
var tags = from t in x group t by t.name into g select new { tagname=g.First().name}; 

El 'Grupo By me tiene perplejo. Cualquier ayuda sería grande ...

+0

Si se ayuda a nadie, aquí está el proyecto que pertenece el código que estoy tratando de convertir y añadir a la página: http: // www .codeproject.com/KB/silverlight/ListDragDropSL.aspx – Graeme

Respuesta

0

Su código se ve un poco loco :) ... es difícil de entender lo que realmente quiere, pero creo que esto es:

var outStuff = Products.SelectMany(p => p.tags) 
    .Where(t => t != null) 
    .GroupBy(t => t.name) 
    .Select(g => new 
    { 
     Name = g.Key, 
     Count = g.Sum(), 
     ViewsTotal = g.Sum(x => x.v), 
     LikesTotal = g.Sum(x => x.nl), 
    }); 
1

Su consulta es una poco intrincado y difícil de seguir, pero déjame intentar describir lo que creo que estás buscando. Usted tiene una lista de Productos, cada uno de los cuales puede tener una o más etiquetas; y desea una lista de todas las etiquetas, con el recuento de cuántos productos tiene esa etiqueta, el número total de vistas de productos con esa etiqueta y el número total de "me gusta" del producto con esa etiqueta. Si ese es el caso, lo siguiente debería hacer el truco:

// may want to add ToArray() here so that filter is not executed multiple times during subsequent query 
var productsWithTags = Products.Where(p => p.tags != null); 
var outStuff = from t in (from p in productsWithTags 
       from t in p.tags 
       select t).Distinct() 
       let matchingProducts = productsWithTags.Where(p => p.tags.Contains(t)) 
       select new { name = t.name, 
          Count = matchingProducts.Count(), 
          viewsTotal = matchingProducts.Sum(p => p.views), 
          num_likesTotal = matchingProducts.Sum(p => p.num_likes) 
          };