Вы получаете анонимный класс, потому что вы используете метод GroupBy . GroupBy в IQueryable
работает почти как предложение SQL GROUP BY
. Чтобы лучше понять группировку, вы должны учитывать, что SQL GROUP BY может использоваться только с такими операторами типа "многие к одному", как SUM
, AVG
, MAX
, MIN
, поскольку они возвращают один результат из набора строк. Ваша концепция "группировки", на мой взгляд, визуальная группировка в графическом интерфейсе.
Нет смысла выбирать всех людей (имя, фамилию) и GROUP BY
фамилию, потому что выбор имени для проецирования на конечный результат неоднозначен.
Оператор GroupBy - это именно то, что вы не хотите использовать. Если вы правильно установили отношение «многие к одному + многие к одному» (которое образует многие ко многим), то у вас должно быть что-то вроде
public class Country{
Store[] stores;
}
public class Store {
Category[] categories;
Country[] countries;
}
public class Category {
Store[] stores;
}
Лучший способ "сгруппировать" значения - использовать простые старые циклы for
. Вот псевдо-C # код
for (Country co in session.Query<Country>()) {
Console.WriteLine(co); //Possibly c.Name or whatever
Console.Indentation++; //.NET has not such a method but you understand what it means
for (Category ca in co.Categories) {
Console.WriteLine(ca);
Console.Indentation++;
for (Store s in ca.Stores) {
Console.WriteLine(s);
}
Console.Indentation--;
}
Console.Indentation--;
}
[Добавить] пример обратного просмотра, который применяется, если ваша модель говорит, что есть ссылка Категория-> Страна, но не Страна-> Категория
for (Country co in session.Query<Country>()) {
Console.WriteLine(co);
Console.Indentation++;
for (Category ca in session.Query<Category>().Where(x => x.Country.equals(co))) {
Console.WriteLine(ca);
//snip
}
Console.Indentation--;
}