正在对我的 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);
我从查询中取出了几行,但在为什么我没有使用连接的类别表的问题之后添加了其中一行。
也许是这样的?
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);