группировать по в запросе LINQ

#c# #.net #linq #group-by

#c# #.net #linq #группировать по

Вопрос:

У меня есть DataTable, к которому я хочу выполнить запрос GroupBy.

 year    url      type     id
=============================
        someurl  image    0
2003             date     0
        someurl  image    1
2009             date     1
  

Мне удалось сгруппировать по моему идентификатору, но я не могу выбрать столбцы «год» и «URL».

Это мой запрос:

 var query = from row in table.AsEnumerable()
            let uri = row["uri"]
            group row by row.Field<int>("id") into grp
            orderby grp.Key
            select new
            {
                ID = grp.Key,
            };
  

Как я могу выбрать столбцы year и URL?

Заранее спасибо.

Ответ №1:

Когда вы группируете по в LINQ, ваша группа (grp) в вашем случае является перечислимой, содержащей все записи в группе (строки данных в вашем случае). Затем вы можете либо предварительно просмотреть записи, либо использовать агрегированные функции, такие как Max, First и т.д. чтобы извлечь единственное значение из перечисляемого

Ответ №2:

Вы можете группировать по нескольким значениям. В вашем случае группировать по идентификатору, году и URL-адресу Проверьте здесь

     List<WebResource> webResources = new List<WebResource>();
    webResources.Add(new WebResource() { Id = 1, Type = "Image", Url = "url1", Year = 2001 });
    webResources.Add(new WebResource() { Id = 1, Type = "Text", Url = "url1", Year = 2001 });
    webResources.Add(new WebResource() { Id = 3, Type = "Image", Url = "url1", Year = 2001 });
    webResources.Add(new WebResource() { Id = 1, Type = "Text", Url = "url1", Year = 2002 });
    webResources.Add(new WebResource() { Id = 2, Type = "Image", Url = "url1", Year = 2002 });
    webResources.Add(new WebResource() { Id = 3, Type = "Text", Url = "url2", Year = 2002 });
    webResources.Add(new WebResource() { Id = 1, Type = "Image", Url = "url1", Year = 2002 });
    webResources.Add(new WebResource() { Id = 2, Type = "Text", Url = "url2", Year = 2002 });

    var output = webResources.GroupBy(webResource => new {webResource.Id, webResource.Year, webResource.Url })
        .Select(group => new {Key = group.Key, Count = group.Count()});

    foreach (var webResource in output)
    {
        Console.WriteLine("Id: "   webResource.Key.Id  " Url:"   webResource.Key.Url   " Year:"   webResource.Key.Year   "  Count:"   webResource.Count);
    }