Преобразование VB Linq в C # - PullRequest
       0

Преобразование VB Linq в C #

6 голосов
/ 12 апреля 2011

Я нахожусь в процессе обучения себя C # путем преобразования существующего проекта, и я застрял в преобразовании следующего кода vb linq:

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

где Products As ObservableCollection(Of ProductModel)

Мне уже удалось преобразовать это так много:

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

Группа «By's» поставила меня в тупик. Любая помощь будет великолепна ...

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Ваш запрос немного запутанный, и за ним трудно следовать, но позвольте мне попытаться описать то, что, я думаю, вы ищете.У вас есть список продуктов, каждый из которых может иметь один или несколько тегов;и вы хотите получить список всех тегов с указанием количества продуктов с этим тегом, общего количества просмотров продуктов с этим тегом и общего количества «лайков» продукта с этим тегом.Если дело обстоит так, следующее должно сделать трюк:

// 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)
                          };
0 голосов
/ 13 апреля 2011

Ваш код выглядит немного сумасшедшим :) ... трудно понять, чего вы на самом деле хотите, но я думаю, что это так:

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),
    });
...