#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>
. Вы не можете преобразовать aList<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(),
};