【问题标题】:LINQ order by local list按本地列表排序的 LINQ
【发布时间】:2013-07-30 09:08:58
【问题描述】:

我从数据库中列出了“公司”。

然后我有另一本字典,例如:

Dictionary<int, string> ordering = new Dictionary<int, string>();
ordering.Add(1, "VIP");
ordering.Add(2, "VIP+");
ordering.Add(3, "Regular");

公司列表必须按此词典排序。

我该怎么做?

我不能通过字典“ordering”加入“companies”,如果这样做我会遇到异常。

有没有办法通过这个“排序”键来“排序”。

字典值(vip、vip+、regular)与我的公司列表中的一列相对应。

【问题讨论】:

    标签: c# .net linq linq-to-sql


    【解决方案1】:

    看起来您的排序字典就您需要使用它的方式而言是从后到前的,即根据文本键查找并给出数字排序。我建议先“反转”您的排序字典,然后您可以根据每个条目的字典查找成本以及 LINQ 排序算法的成本对公司进行排序。

    var swappedOrdering = ordering.ToDictionary(kvp => k.Value, kvp => k.Key);
    var orderedCompanies = companies.OrderBy(c => ordering[c.CompanyCategory]);
    

    请记住,尽管您的排序字典是内存,而不是在数据库中,所以为了使用这种方法,您需要将所有记录假脱机到内存中。如果您希望数据库完成繁重的工作,则必须将此订购信息放入数据库中。

    【讨论】:

      【解决方案2】:

      除了 Jon G 所说的之外,您还可以通过加入来做到这一点。像这样的东西应该可以解决问题:

      var companyQuery = from c in companies
                         join kvp in ordering on c.CompanyCategory equals kvp.Value
                         orderby kvp.Key
                         select c;
      

      【讨论】:

      • 不,我不能。它引发异常。 Linq to sql 无法将数据库查询加入本地列表
      • 确实如此。我假设您之前已经将公司列表加载到内存中。我认为你不能做你想做的事情,除非你 1)首先将公司加载到内存中,或者 2)将“排序”字典放在它自己的数据库表中。
      【解决方案3】:

      您可以使用自定义 OrderBy 语句,例如:

      public List<Company> OrderCompanies()
      {
          Dictionary<int, string> ordering = new Dictionary<int, string>();
          ordering.Add(1, "VIP");
          ordering.Add(2, "VIP+");
          ordering.Add(3, "Regular");
      
          // This could be the database source
          List<Company> companies = new List<Company>();
          companies.Add(new Company() { CompanyCategory = "VIP" });
          companies.Add(new Company() { CompanyCategory = "VIP+" });
      
          return companies
              .OrderBy(company => ordering.First(pair => pair.Value == company.CompanyCategory).Key)
              .ToList();
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-29
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        相关资源
        最近更新 更多