#c# #vb.net #linq #c#-4.0 #linq-to-objects
#c# #vb.net #linq #c #-4.0 #привязка к объектам
Вопрос:
Я нахожусь в процессе самостоятельного изучения 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};
‘Group By’ ставит меня в тупик. Любая помощь была бы отличной…
Комментарии:
1. Если это кому-нибудь поможет, вот проект, к которому принадлежит код, который я пытаюсь преобразовать и добавить на страницу: codeproject.com/KB/silverlight/ListDragDropSL.aspx
Ответ №1:
Ваш запрос немного запутан и его трудно понять, но позвольте мне попытаться описать то, что, как я думаю, вы ищете. У вас есть список продуктов, каждый из которых может иметь один или несколько тегов; и вам нужен список всех тегов с подсчетом того, сколько продуктов имеют этот тег, общее количество просмотров продуктов с этим тегом и общее количество «лайков» продукта с этим тегом. Если это так, то следующее должно сработать:
// 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)
};
Ответ №2:
Ваш код выглядит немного сумасшедшим 🙂 … трудно понять, чего вы на самом деле хотите, но я думаю, что это оно:
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),
});