2011-04-12 16 views
6

Jestem w procesie nauczania sobie C# poprzez przekształcenie istniejącego projektu i jestem przebijał konwersji następujący kod VB linq:Konwersja VB Linq do 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 

gdzie Products As ObservableCollection(Of ProductModel)

Mam mananged Aby przekonwertować tak dużo do tej pory:

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}; 

The 'Group By's ma mnie zakłopotany. Każda pomoc będzie wielki ...

+0

Jeśli to pomoże każdemu, oto projekt, do którego należy kod, który próbuję przekonwertować i dodać do strony: http: // www .codeproject.com/KB/silverlight/ListDragDropSL.aspx – Graeme

Odpowiedz

0

Twój kod wygląda trochę szalony :) ... to trudno zrozumieć, co rzeczywiście chcesz, ale myślę, że to jest to:

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

Zapytanie jest trochę zawiłe i trudne do naśladowania, ale pozwól mi spróbować opisać to, czego myślę, że szukasz. Masz listę produktów, z których każda może mieć jeden lub więcej tagów; i chcesz listę wszystkich tagów, z ilu produktów ma ten tag, całkowitą liczbę wyświetleń produktów z tym tagiem i całkowitą liczbę "polubień" produktu z tym tagiem. W takim przypadku należy wykonać następujące czynności:

// 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) 
          };