【问题标题】:How to do multiple groupings with a concrete class?如何使用具体类进行多个分组?
【发布时间】:2012-03-22 18:37:20
【问题描述】:

我有这种情况。

我想要按国家和类别分组。

A store can have many countries and a country can have many stores. (many to many)
A store can have many categories and a category can have many stores (many to many)

假设我有这些类别

Food
Gas
Car Shop

我有这些商店

Pizza Hut
Canadian Tire
Shell

我有这些国家

Canada
USA

所以最后应该是这个样子

Canada
 Food
   Pizza Hut
 Gas
  Canadian Tire (some places have gas stations)
  Shell
 Car Shop
  Canadian Tire
USA
  Food
    Pizza Hut
  Gas
   Shell
  Car Shop
   (nothing in my example as Canadian Tire is only in Canada)

以上几乎是我想向用户展示的最终结果。我现在被困在 linq 中的分组(我也在使用 nhibernate)

 session.Query<Store>().FetchMany(x => x.Countries).FetchMany(x => x.Categories).GroupBy(x => new {x.Countires, x.Categories})

上面会给我一个匿名类,但我需要从服务层返回结果,然后使用它们来制作我的视图模型。

所以我不能使用匿名类。

我不确定如何制作具体的课程?

它是否需要像 Igrouping 之类的东西?

【问题讨论】:

  • 不确定您对模型的描述是否一致。你是说一家商店可以属于几个国家。奇怪...
  • 我不确定你的意思。是的,一家商店可以在多个国家/地区。

标签: c# .net linq nhibernate group-by


【解决方案1】:

如果你定义了一个类,比如 MyClass,它具有正确的属性和适当的构造函数,可以在查询中使用 new MyClass(x.Countries, x.Categories) 而不是匿名类型构造函数。

或者您可以只使用不带参数的默认构造函数,并使用正常的 C# 属性初始化语法。我的手机不会使用大括号,所以我无法发布代码 sn-p :-(

【讨论】:

  • 当你可以的时候。请贴一个代码sn-p,这样我更容易完全理解你的意思。
【解决方案2】:

您获得了一个匿名类,因为您使用的是GroupBy 方法。 IQueryable 中的 GroupBy 几乎与 SQL GROUP BY 子句一样工作。为了更好地理解分组,您必须考虑 SQL GROUP BY 可以SUMAVGMAXMIN 等多对一运算符一起使用,因为它们从行集中返回单个结果。在我看来,您的“分组”概念是 GUI 上的视觉分组。

选择所有人(姓名、姓氏)和GROUP BY姓氏是没有意义的,因为在最终结果上投影的名称的选择是模棱两可的。

GroupBy 运算符正是您不想使用的。如果您正确建立了多对一+多对一的关系(形成多对多),那么您应该有类似

public class Country{

    Store[] stores;
}

public class Store {
    Category[] categories;
    Country[] countries;
}

public class Category {
    Store[] stores;
}

“分组”值的最佳方法是使用普通的旧 for 循环。这是pseuso-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--;
}

[添加] 反向查找示例,如果您的模型表明存在引用 Category->Country 但没有 Country->Category,则适用此示例

   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--;
    }

【讨论】:

  • 是的,我展示的是视觉效果,看看最终结果会是什么样子。对我来说,你有一个商店似乎很有意义,你可以用许多不同的方式对它进行分组,所以这就是为什么 groupby 对我来说似乎很有意义。
  • GroupBy 和 SQL GROUP BY 返回 lists,您实际上需要一棵 对象(一个对象关联到多个对象)。我认为这可以更好地帮助您了解差异。如果您对 RDBMS 世界中的分组有更多概念性问题,请随时询问 SO,也许您可​​以找到很好的解释
  • 我也没有得到你代码的第一行。你是怎么得到国家的。自您查询商店以来,它不会先获取商店吗?
  • 第一行代码自然出现在我们定义树之后。在分层视图中,它是 Country->Category->Store,因此我们需要先“检索国家/地区”。由于所有对象都在同一个数据库中,因此我选择直接查询国家/地区,因为我现在不需要商店。
  • 但是你有 session.Query() 而不是 session.Query();
猜你喜欢
  • 2019-08-31
  • 2021-02-17
  • 2014-08-30
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多