我有这个公司列表(加入类别),我通过自由文本输入搜索,通常按名称/字母顺序排序结果。
但是,当退回的公司链接到某个类别(这些更重要的类别的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表。
答案 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);