2

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

但是,当返回的公司链接到某个类别时(这些更重要类别的 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);

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

4

5 回答 5

4

也许像这样?

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,可以动态计算。

正如建议的那样,这也可以,但如果您想按 categoryID 订购,则不行:

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

从不使用 ct 有什么原因吗?

于 2013-02-02T20:02:14.573 回答
1

我会尝试

orderby (importantCategories.Contains(ct.CatetoryId) 
                            ? 0
                            : 1),
         c.Name
于 2013-02-02T19:59:50.937 回答
1

首先,我认为您不需要进行联接,因为您实际上并未使用该类别中的任何数据。您仅使用类别 ID 进行过滤,并且Company已经包含该数据。其次,您应该使用OrderBy自定义键选择器和 aThenBy以便您可以在类别中按字母顺序排列。这应该归功于它使用流利的语法。

它首先按类别 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);
于 2013-02-02T20:07:45.633 回答
1

您可以使用 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”

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

于 2013-02-02T20:10:10.930 回答
0

这类似于 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);
于 2013-02-02T20:44:42.300 回答