Вопрос C # LINQ с потенциальной группировкой по слоям

#c# #linq #group-by #linq-to-sql

#c# #linq #группировка по #linq-to-sql

Вопрос:

Я новичок в linq, поэтому любые предложения очень полезны. Допустим, у меня есть набор данных, который выглядит так

 acct    dim         unit_code
10000   DIMENSION2  100
10000   DIMENSION2  1000
10000   DIMENSION2  1300
10000   DIMENSION2  1400
20000   DIMENSION2  1500
20000   DIMENSION2  200
20000   DIMENSION2  600
20000   DIMENSION2  700
20000   DIMENSION2  800
20000   DIMENSION2  900
10000   DIMENSION3  FGAC
10000   DIMENSION3  FGCP
10000   DIMENSION3  FGCV
10000   DIMENSION3  FGED
20000   DIMENSION3  FGES
20000   DIMENSION3  FGGM
20000   DIMENSION3  FGLD
20000   DIMENSION3  FGNB
20000   DIMENSION3  FGOR
20000   DIMENSION3  FGPM
10000   DIMENSION4  ENDO
20000   DIMENSION4  OTHR
20000   DIMENSION4  POTN
  

и вот мои классы

 public class RestrictionRule
{
    public string acct { get; set; }
    public List<dim> dims { get; set; }
}
public class dim
{
     public string dim { get; set; }
     public List<unit_code> unit_codes  { get; set; }
}
public class unit_code
{
     public string unit_code{ get; set; }
     public string unit_code_description  { get; set; }
}
  

Я пытаюсь вернуть класс RestrictionRule, поэтому я начинаю составлять что-то вроде

 var result = (from a in dataset
              group a by new
              {
                a.acct,
                a.dim,
              } into b
              select new RestrictionRule()
              {
                acct = b.Key.acct,
                dims = b.ToList(),
              });
  

На данный момент я не уверен, почему у меня есть исключение (не может неявно ‘system.collections.generic.list в system.collections.generic.list’) против «dims = b.ToList(),«. Кроме того, поскольку класс RestrictionRule имеет два списка (Dim и unit_code), которые находятся в иерархии, пожалуйста, подскажите мне, как я могу создать его правильно. Заранее благодарю всех за помощь.

Комментарии:

1. Пример данных в виде изображения. Приятно и легко копировать в LINQPad…

2. Спасибо за напоминание. Я просто редактирую его, чтобы теперь это не было изображением.

3. «Я не уверен, почему у меня есть исключение» — какое исключение? Что означает «добавить информацию unit_code»? Как добавить? Представлен как? Как используется?

4. Я просто редактирую свой вопрос и, надеюсь, это полезно.

5. So dims имеет тип List<dim> (тип является ключевым в C #). b имеет тип IGrouping<Tanon1, Tanon2> и после ToList того, как у вас есть List<anon2> . Вы не можете преобразовать a List<anon2> в List<dim> неявно.

Ответ №1:

Вам необходимо сгруппироваться на каждом уровне, чтобы создать соответствующие типы:

 var result = from d in dataset
             group d by d.acct into acctGroup
             select new RestrictionRule {
                acct = acctGroup.Key,
                dims = (from d in acctGroup
                        group d by d.dim into dimGroup
                        select new Dim {
                            dim = dimGroup.Key,
                            unit_codes = (from d in dimGroup
                                         select new UnitCode {
                                            unit_code = d.unit_code,
                                            // unit_code_description = ???
                                         })
                                         .ToList()
                        })
                        .ToList()
             };
  

Ответ №2:

Этот запрос LINQ не может быть переведен в SQL. GROUP BY может возвращать только результат агрегации и поля, которые являются поисковыми ключами. Рассмотрите оценку на стороне клиента, потому что вам нужны все записи на клиенте.

 var result = from a in dataset.AsEnumerable()
             group a by new
             {
               a.acct,
               a.dim,
             } into b
             select new RestrictionRule()
             {
               acct = b.Key.acct,
               dims = b.ToList(),
             };