Linq- asp. net Core - получить только одну строку после группировки - PullRequest
0 голосов
/ 22 апреля 2020

Newb ie в linq, мне трудно получить действительно первый ряд после группы. Он всегда возвращает первый ряд каждой группы. Например, с данными моих тестов я получаю две строки в результате.

Но мне нужна только одна строка. Первый.

В конце моего запроса есть:

...... select new {RGBCode=Query3.RGBCode} into LastQuery
group LastQuery by LastQuery.RGBCode into grouping
orderby grouping.Count() descending 
select grouping.First()

Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Я рассматриваю ваш тест на основе комментариев, и я создал набор тестов, например:

List<RgbTest> rgbs = new List<RgbTest>
{
    new RgbTest{Id=2,Code="#F5FF10"},
    new RgbTest{Id=2,Code="#F5FF10"},
    new RgbTest{Id=2,Code="#F5FF10"},
    new RgbTest{Id=2,Code="#9B59b6"},
    new RgbTest{Id=2,Code="#9B59b6"},
};

, вы можете получить данные двумя способами:

string rgbTestCode = rgbs.GroupBy(x => new { x.Id, x.Code })
    .OrderByDescending(y => y.Count())
    .FirstOrDefault()
    .FirstOrDefault()
    ?.Code;

Или

string rgbCode = (from a in rgbs
                  group a by a.Code into groupedRgb
                  orderby groupedRgb.Count() descending
                  select groupedRgb.FirstOrDefault())
                  .FirstOrDefault()
                  ?.Code;

Результат

#F5FF10

Надеюсь, это поможет вам.

0 голосов
/ 22 апреля 2020

Когда вы группируете что-то в LINQ, результатом является IEnumerable<IGrouping<TKey, TElement>>, когда вы берете первый, его IGrouping<TKey, TElement>, где TKey - это ключ группы, некоторые конкретные RGBCode в вашем случае и TElement - фактические объекты, которые есть общие TKey

var list = new List<A>
{
  new A{SomeProp = 1 },
  new A{SomeProp = 2 },
  new A{SomeProp = 2 },
  new A{SomeProp = 1 },
  new A{SomeProp = 2 },
};

 IEnumerable<IGrouping<Int32, A>> grouped = list.GroupBy(a => a.SomeProp); // Here the grouping is going on;
 IOrderedEnumerable<IGrouping<int, A>> ordered = grouped.OrderBy(group => group.Count()); // Ordered groups; 
 IGrouping<Int32, A> first = ordered.First(); // First Group, Note the type is "IGrouping<Int32, A>";
 Console.WriteLine($"The key group is: {first.Key}");
 Console.WriteLine("Group Values are:");
 first.ToList().ForEach(a => Console.WriteLine(a.SomeProp)); // First Group actual elements are enumearated and SomeProp property is printed;

 Output: 
 //The key group is: 1
 //Group Values are:
 //1
 //1

Таким образом, если бы я хотел показать сначала SomeProp из первой группы, я должен был бы сделать это: first.First().SomeProp - Output: 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...