正在对我的 LINQ 进行排序

本文关键字:排序 LINQ 我的 | 更新日期: 2023-09-27 17:57:03

我有这个公司列表(加入类别),其中我按自由文本输入进行搜索,通常按名称/字母顺序对结果进行排序。

但是,当返回的公司链接到某个类别时(这些更重要类别的 id 在列表中),我想主要对这些类别中的公司进行排序,其次是按字母顺序排序。

如何添加此订单?

    List<int> importantCategories = new List<int>() { 14, 99, 4428 };
    var companies = (from c in context.Companies
                     join ct in context.Categories on c.CategoryId equals ct.CategoryId
                     where ct.Active == true 
                     && c.Name.Contains(freeTextFilter)
                     orderby c.Name
                       --- if company is from category 14, 99, 4428 
                           then the ordering should place those above the rest
                     select c);

我从查询中取出了几行,但在为什么我没有使用连接的类别表的问题之后添加了其中一行。

正在对我的 LINQ 进行排序

也许是这样的?

List<int> importantCategories = new List<int>() { 14, 99, 4428 };
var companies = (from c in context.Companies
                 join ct in context.Categories on c.CategoryId equals ct.CategoryId
                 where c.Name.Contains(freeTextFilter)
                 orderby importCategories.Contains(ct.CategoryID) ? 0 : 1, c.Name
                 select c);

或者,如果您希望类别也导致顺序,那么您可以尝试以下操作:

orderby importCategories.Contains(ct.CategoryID) ? ct.CategoryID : 4429, c.Name

4429 只是列表的最大值 + 1,可以动态计算。

正如建议的那样,这也将起作用,但如果您想按类别 ID 排序,则不行:

orderby !importCategories.Contains(ct.CategoryID) , c.Name
有什么

理由从不使用ct吗?

我会尝试

orderby (importantCategories.Contains(ct.CatetoryId) 
                            ? 0
                            : 1),
         c.Name

首先,我认为您不需要进行连接,因为您实际上并没有使用该类别中的任何数据。 您仅使用类别 ID 进行筛选,并且Company已包含该数据。 其次,您应该将OrderBy与自定义键选择器和ThenBy一起使用,以便您可以在类别中按字母顺序排列。 这应该是因为它使用了流畅的语法。

它首先按类别 id 排序,但仅当它们在指定的类别中时,其他条目才被视为相同 ( int.MaxValue )。 然后,它在类别选择中按Name排序。 如果您不关心第一部分的类别顺序,则可以使用 c => categories.Contains(c.CategoryId) ? 0 : 1 作为键选择器。

var categories = new int[] { 14, 99, 4428 };
var companies = context.Companies
                       .Where(c => c.Name.Contains(freeTextFilter))
                       .OrderBy(c = categories.Contains(c.CategoryId) 
                                        ? c.CategoryId 
                                        : int.MaxValue)
                       .ThenBy(c => c.Name);

您可以使用 ThenBy: 下面是一个示例

 List<string> strings = new List<string> { "f", "a", "b", "c", "d", "e" };
        var result = strings.OrderByDescending(x => x == "e")
                            .ThenByDescending(x => x == "c")
                            .ThenBy(x=>x);

这给出了 "e"、"c"、"a"、"b"、"d"、"f"

我认为您可以将其应用于您的问题以获得正确的排序。

这类似于 Hogan 的答案,只使用扩展方法和 Lambda 表达式而不是查询语法(尽管可以说这可能是查询语法更容易的情况)。

var companies = context.Companies
    .Join(context.Categories, c => c.CategoryId, ct => ct.CategoryId, (c, ct) => c)
    .Where(c => c.Name.Contains(freeTextFilter))
    .OrderBy(c => importantCategories.Contains(c.CategoryId) ? 0 : 1)
    .ThenBy(c => c.Name);

假设您可能并不真正需要加入...

var companies = context.Companies
    .Where(c => c.Name.Contains(freeTextFilter))
    .OrderBy(c => importantCategories.Contains(c.CategoryId) ? 0 : 1)
    .ThenBy(c => c.Name);