订购我的LINQ

时间:2013-02-02 19:56:07

标签: c# linq

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

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

我从查询中删除了几行,但在问题之后添加了其中一行,为什么我没有使用已加入的Categories表。

5 个答案:

答案 0 :(得分: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?

答案 1 :(得分:1)

我会尝试

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

答案 2 :(得分:1)

首先,我认为您不需要进行连接,因为您实际上并未使用该类别中的任何数据。您只使用类别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);

答案 3 :(得分: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”

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

答案 4 :(得分: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);