Linq在2个条件下排序

时间:2015-02-27 16:56:55

标签: c# linq

我有一个Customer列表,其CustomerID和ParentCustomerID引用另一个客户的CustomerID

我想要的是,如果ParentCustomerID为0,则通过ParentCustomerID或CustomerID订购我的客户列表,我的想法是我要列出我的所有客户,但是" group"他们在某种程度上让父母与孩子在一起。

结果看起来像这样

Customer 1 - Parent 0
Customer 2 - Parent 1
Customer 3 - Parent 1
Customer 4 - Parent 0
Customer 5 - Parent 0
Customer 6 - Parent 5

如何编写我的Linq查询来实现这一目标?

5 个答案:

答案 0 :(得分:3)

哇,经过一番头疼之后,这似乎完全符合您的目标

var ordered = customers.OrderBy(c => c.ParentCustomerId == 0 ? c.CustomerId : c.ParentCustomerId)
                       .ThenBy(c => c.CustomerId);

实例:http://rextester.com/OKKXW89193

答案 1 :(得分:0)

相应更新。根据你在问题上的描述,这应该足够了。

试一试并发布结果,请:

var ordered = customers
   .Select(_c => new { Factor1 = _c.ParentCustomerID == 0 ? _c.CustomerID : _c.ParentCustomerID, Factor2 = _c.CustomerID, Customer = _c })
   .OrderBy(_customer => _customer.Factor1)
   .ThenBy(_customer => _customer.Factor2)
   .Select(_c => _c.Customer);

答案 2 :(得分:0)

您可以编写一个接近您的口头描述的LINQ查询。第一顺序父母和孩子一起基于父母和#39; id,然后在他们各自的父母之后根据他们的id订购孩子。

customers.OrderBy(c => c.ParentID > 0 ? c.ParentID : c.CustomerID)
         .ThenBy(c => c.ParentID == 0 ? 0 : c.CustomerID)

这假设您的层次结构只有一层深(即,父母的客户也不能是孩子)。我不相信递归操作可以在LINQ中表达。

答案 3 :(得分:0)

这是一个想法,正如您在OP的示例中所看到的,隐藏的订单值是这样的:

Customer 1 - Parent 0 -- OrderValue is 1.0
Customer 2 - Parent 1 -- OrderValue is 1.2
Customer 3 - Parent 1 -- OrderValue is 1.3
Customer 4 - Parent 0 -- OrderValue is 4.0
Customer 5 - Parent 0 -- OrderValue is 5.0
Customer 6 - Parent 5 -- OrderValue is 5.6

所以这是我的代码:

            var ordered =
            customers.OrderBy(
                c =>
                    c.ParentCustomerId == 0
                        ? c.CustomerId.ToString() + "." + c.ParentCustomerId.ToString());
                        : c.ParentCustomerId.ToString() + "." + c.CustomerId.ToString());

或者如果你不喜欢字符串:

            var ordered = customers.OrderBy(
            c => 
                c.ParentCustomerId ==0
                ? c.CustomerId
                : c.ParentCustomerId + c.CustomerId / (double)customers.Count);

答案 4 :(得分:-1)

    var ordered = customers.OrderBy(_customer => customer.CustomerID)
                           .ThenBy(_customer => _customer.CustomerParentID);

应该工作。