代码之家  ›  专栏  ›  技术社区  ›  Byron Sommardahl

同时排序集合和子集合

  •  1
  • Byron Sommardahl  · 技术社区  · 14 年前

    我有一个 IQueryable<Product> 那需要分类 Name . 各 Product 有一个 IQueryable<Category> 也需要按 名字 . 我很难用LINQ表达这一点。我可以循环浏览产品并对每个类别列表进行排序,但看起来很混乱。希望林克忍者有一个更聪明的解决方案。

    我的 产品 类的外观如下:

    public class Product {
        public string Name { get; set; }
        public IQueryable<Category> Categories { get; set; }
    }
    

    我的 Category 类的外观如下:

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

    目前,我正在这样做:

     var myProducts = products.OrderBy(x => x.Name).Select(x => new Product { 
        Name = x.Name,
        Categories = x.Categories(y => y.Name)
    });
    

    问题是,当使用像nhibernate这样的东西时,这会创建新的产品对象,基本上从nh会话断开产品。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Ian Mercer    14 年前

    您不想修改 Product 以任何方式影响持久性,并且您不想创建新的 产品 实例。

    所以把这个添加到 产品 班级:

    public IOrderedEnumerable<Category> CategoriesOrderedByName
    {
      get { return this.Categories.OrderBy(y => y.Name); }
    }
    

    使用 product.CategoriesOrderedByName 相反,当您需要在您的UI代码中使用已排序的版本时。

    没有这个,任何人使用你的班级都没有期望 Category 对象以任何方式排序。通过这一点,您可以明确地通知您的类的消费者期望什么,并且您打算总是按排序顺序返回它们。您也可以使用 IOrderedEnumerable<> 作为返回类型,允许使用 ThenBy() .

        2
  •  0
  •   Ronald Wildenberg    14 年前

    也许这就是你想要的?但是,您不会得到每个产品都有一个类别列表的产品列表。使用LINQ是不可能的,因为您不能使用LINQ更改集合,您只能从现有集合中创建新集合(在我的示例中 p.Categories 是现有的集合, SortedCategories 新的那个)。

    from p in products
    orderby p.Name
    select new
    {
        Product = p,
        SortedCategories = from c in p.Categories
                           orderby c.Name
                           select c
    }
    

    你说你有 IQueryable 这是否意味着您正在使用此LINQ语句查询数据库?我不确定这种转换到SQL(性能方面)的效果如何。

        3
  •  0
  •   Matt Mills    14 年前

    为什么不把可枚举的排序在适当的位置?

    products = products.OrderBy(x => x.Name);
    products.ToList().ForEach(x => x.Categories = x.Categories.OrderBy(y => y.Name));
    

    正如其他人所说,如果你有关系,这可能会表现不佳。

        4
  •  0
  •   Community dbr    7 年前

    如果你想列举 Product 按顺序排列并在每个对象中 产品 你想要 Categories 按照排序顺序,您可以这样做。

    var sorted = products
        .Select(
            p => new
            {
                Product = p,
                Categories = p.Categories.OrderBy(c => c.Name)
            }
        )
        .OrderBy(x => x.Product.Name);
    

    看起来这基本上就是 Ronald 只有在不使用LINQ语法的情况下。