在简单/未命名的 C# LINQ 组连接中排序内部密钥源

2024-07-01

我知道这个问题由于用词不同而读起来很奇怪。但这是使用的术语这个 MSDN 页面 http://msdn.microsoft.com/en-us/library/bb311040.aspx从我正在学习 LINQ 组的地方开始,我将解释它们。

我正在尝试 LINQ 的数据是:

    class Product
    {
        public string Name { get; set; }
        public int CategoryID { get; set; }
    }

    class Category
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }

    // Specify the first data source.
    static List<Category> categories = new List<Category>()
    { 
        new Category(){Name="Beverages", ID=001},
        new Category(){ Name="Condiments", ID=002},
        new Category(){ Name="Vegetables", ID=003},
        new Category() {  Name="Grains", ID=004},
        new Category() {  Name="Fruit", ID=005}            
    };

    // Specify the second data source.
    static List<Product> products = new List<Product>()
    {
        new Product{Name="Cola",  CategoryID=001},
        new Product{Name="Tea",  CategoryID=001},
        new Product{Name="Mustard", CategoryID=002},
        new Product{Name="Pickles", CategoryID=002},
        new Product{Name="Carrots", CategoryID=003},
        new Product{Name="Bok Choy", CategoryID=003},
        new Product{Name="Peaches", CategoryID=005},
        new Product{Name="Melons", CategoryID=005},
    };

现在条款:

  • 简单/未命名的组加入是我们直接选择组的一个:

    //... 
    join product in products on category.ID equals product.CategoryID into prodGroup                      
            select prodGroup;
    

    而不是选择匿名类型或使用嵌套from-select clause.

  • 外部密钥源在 LINQ group join 中是一个数据源from关键词,内部密钥源是一个数据源,如下join keyword

    我称之为简单的群组加入unnamed(为了方便起见),因为我们在所选组中没有外部密钥源名称/Id。

我试图编写简单/未命名的查询,它将产生以下结果,首先按外部 keysource 属性排序,然后按内部 keysource 属性排序:

Unnamed Group
  Cola
  Tea
Unnamed Group
  Mustard
  Pickles
Unnamed Group
  Melons
  Peaches
Unnamed Group
Unnamed Group
  Bok Choy
  Carrots

我可以通过外部密钥源进行订购,如下所示:

var simpleGroupJoinOrderby = 
        from category in categories
        orderby category.Name           //orderby outer ks
        join product in products on category.ID equals product.CategoryID into prodGroup                      
        select prodGroup;

foreach (var unnamedGroup in simpleGroupJoinOrderby)
{   
    Console.WriteLine("Unnamed group");
    foreach(var product in unnamedGroup)
    {
        Console.WriteLine("  " + product.Name);
    }
}

但它产生以下输出:

Unnamed group
  Cola
  Tea
Unnamed group
  Mustard
  Pickles
Unnamed group
  Peaches
  Melons
Unnamed group
Unnamed group
  Carrots
  Bok Choy

但我无法订购未命名类别组下的产品。

我知道我可以通过选择匿名类型来做到这一点,如下所示:

        var namedGroupJoinOrderBy =
            from category in categories
            orderby category.Name  //order group hierarchy by name
            join product in products on category.ID equals product.CategoryID into prodGroup
            select
            new
            {
                Category = category.Name,
                Products = from prod in prodGroup
                           orderby prod.Name       //order by prodGroup.prod.Name under particular group hierarchy
                           select prod
            };

        foreach (var category in namedGroupJoinOrderBy)
        {
            Console.WriteLine("Category : " + category.Category);
            foreach (var product in category.Products)
            {
                Console.WriteLine("   " + product.Name);
            }
        }

但是我只是想知道我是否可以在不选择匿名类型的情况下执行相同的操作。我觉得它在语法上应该与“两个”关键源上的顺序和选择匿名类型无关。因此,应该有某种方法可以在查询本身中执行此操作,如下所示,但它不起作用:

var simpleGroupJoinOrderby = 
            from category in categories
            orderby category.Name           //orderby outer ks
            join product in products on category.ID equals product.CategoryID into prodGroup    
            orderby product.Name   //Err: The name 'product' does not exist in the current context
            select prodGroup;

你可以直接订购products加入前:

var simpleGroupJoinOrderby = 
    from category in categories
    orderby category.Name     
    join product in products.OrderBy(p => p.Name) 
        on category.ID equals product.CategoryID into prodGroup                      
    select prodGroup;

结果是:

Unnamed group
  Cola
  Tea
Unnamed group
  Mustard
  Pickles
Unnamed group
  Melons
  Peaches
Unnamed group
Unnamed group
  Bok Choy
  Carrots

它有效是因为Join保留了 external 元素的顺序,并且对于每个元素,inner 的匹配元素的顺序(引用自MSDN http://msdn.microsoft.com/en-us/library/bb534675.aspx).


一些替代方案(更像你的例子):

var simpleGroupJoinOrderby = categories.OrderBy (c => c.Name)
                                       .GroupJoin(products, 
                                                  c => c.ID, 
                                                  p => p.CategoryID, 
                                                  (c, ps) => ps.OrderBy(p => p.Name));

var simpleGroupJoinOrderby = from category in categories
                             orderby category.Name     
                             join product in products
                                on category.ID equals product.CategoryID into prodGroup                      
                             select prodGroup.OrderBy(g => g.Name); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在简单/未命名的 C# LINQ 组连接中排序内部密钥源 的相关文章

随机推荐

  • 如何使用 Jsoup 仅删除文本中的 html 标签?

    我想使用 JSOUP 从文本中仅删除 html 标签 我使用了这里的解决方案 我之前关于 JSOUP 的问题 https stackoverflow com questions 33466557 jsoup remove only html
  • iOS-Charts 如何将 UIImage 放在点旁边

    我想使用 iOS Charts 和 Swift 来绘制一些折线图来显示数据 现在 我有一个要求 在每个点旁边放置一个小图标 现在我可以在图表上添加 UIImage 但问题是如何正确获取每个点的 CGPoint 坐标 如果我改变设备或设备类型
  • LAPACK正交化函数

    lapack 中是否有现成的例程来执行正交归一化 例如 Gram Schmidt 或 QR 方法的某些变体 如果不是 使用 lapack 执行正交归一化的建议方法是什么 就在这里 看着 sgeqrf single precision rea
  • Go 中将字符串转换为二进制

    在 Go 中如何将字符串转换为其二进制表示形式 Example 输入 A 输出 01000001 在我的测试中 fmt Sprintf b 75 仅适用于整数 将 1 个字符的字符串转换为字节以获得其数字表示形式 s A st fmt Sp
  • 在浏览器中输入有效网址时,React 路由不断重定向到登陆页面

    我有这个路由配置 它工作得很好 只有一件事一直让我烦恼 即使导航应用程序有效 当我转到地址栏并按 Enter 键时 它会将我重定向到 添加用户即使我不更改网址并按 Enter 键 这是我的路线配置 function AppRoutes se
  • OnGuard 许可

    最近 我研究了使用 OnGuard 来帮助诚实的人遵守他们的原则 我同意这里许多人表达的观点 即任何许可制度都无法保护您免受那些想要使用您的软件但不想付费的人的侵害 另一方面 我想避免让其他人太容易为我的程序创建有效密钥 研究完手册和示例后
  • 从 RoR 模型中获取两个随机元素

    我正在尝试使用 RoR 来做一些简单的事情 但在掌握基础知识方面遇到了一些困难 我最接近的背景是 ASP NET MVC 但我发现所有 RoR 教程都重点关注 Rails 真正擅长的内容 脚手架的东西 而不是如何制作自己的操作并让它们使用参
  • 如何在 MYSQL 中通过另一列选择具有 MAX(列值)、PARTITION 的行?

    我有一张球员表现表 CREATE TABLE TopTen id INT UNSIGNED PRIMARY KEY AUTO INCREMENT home INT UNSIGNED NOT NULL datetime DATETIME NO
  • 如何通过CLI / PUTTY访问AWS RDS?

    我是AWS新手 我可以通过putty访问EC2用户 像这样我如何通过 PUTTY 连接 AWS RDS 我有AWS RDS端点 如果我尝试如下 mysql h testing cx2wamr3cbzm us west 2 rds amazo
  • 连接到 javascript/node.js 中的 Gmail IMAP API

    我正在尝试通过其连接到 gmailIMAP API https developers google com google apps gmail oauth overview 我正在使用布鲁诺 莫伦西的节点 imap 库 https gith
  • 实体框架 - 将枚举的 ICollection 保存在数据库中

    我有一个具有 type 属性的类ICollection
  • 有效地将字符串(或元组)转换为 ctypes 数组

    我有一段代码 它采用 PIL 图像并将其转换为 ctypes 数组以传递给 C 函数 w px h px img size pixels struct unpack dI w px h px img convert RGBA tostrin
  • 将 ManualResetEvent 包装为可等待任务

    我想等待手动重置事件 并超时并观察取消 我想出了类似下面的东西 手动重置事件对象由我无法控制的 API 提供 有没有办法在不占用和阻塞 ThreadPool 线程的情况下实现这一点 static Task
  • 将 geom_text 与 ggplot2 中的 geom_vline 对齐

    I used vjust作为解决方法并详细阐述 通过尝试和错误可以接受的距离 但这有时非常耗时且变化 与字体大小和轴比例 有没有更好的方法来自动对齐示例中的文本 library ggplot2 ggplot data mtcars aes
  • 如何阻止richfaces风格?

    我开发了这个联系表格
  • 反应调试模式和正常模式之间的本机不同行为

    嗨 我有一个非常复杂的问题 所以我在 github 上为这个问题创建了一个新的存储库 所以你可以克隆它并看看问题是什么 https github com guitar9 hafas client example https github c
  • 如何在 iOS 8 中呈现半透明(半切)视图控制器

    在iOS 7中此方法没有问题 rootViewController modalPresentationStyle UIModalPresentationCurrentContext rootViewController presentVie
  • 在 UITextView 内画一条线 - NSAttributedString

    我想在里面画一条可定制的线UITextView由一些文本组成 使用NSAttributedString 这是我尝试过的 NSString unicodeStr NSString stringWithFormat C C C 0x00A0 0
  • 执行时忽略字符串列

    我使用以下代码来标准化 pandas DataFrame df norm df df mean df max df min 当所有列都是数字时 此方法效果很好 但是 现在我有一些字符串列df并且上述标准化有错误 有没有办法只对数据帧的数字列
  • 在简单/未命名的 C# LINQ 组连接中排序内部密钥源

    我知道这个问题由于用词不同而读起来很奇怪 但这是使用的术语这个 MSDN 页面 http msdn microsoft com en us library bb311040 aspx从我正在学习 LINQ 组的地方开始 我将解释它们 我正在