C# 开启条件下2个字段的Linq顺序

C# 开启条件下2个字段的Linq顺序,c#,linq,C#,Linq,我有一个CustomerID和ParentCustomerID的客户列表,其中ParentCustomerID指的是另一个客户的CustomerID 我想要的是按ParentCustomerID或CustomerID(如果ParentCustomerID为0)对客户列表进行排序,其想法是我想要列出我的所有客户,但要以某种方式将其“分组”,以使父客户与其子客户在一起 结果是这样的 Customer 1 - Parent 0 Customer 2 - Parent 1 Customer 3 - Pa

我有一个CustomerID和ParentCustomerID的客户列表,其中ParentCustomerID指的是另一个客户的CustomerID

我想要的是按ParentCustomerID或CustomerID(如果ParentCustomerID为0)对客户列表进行排序,其想法是我想要列出我的所有客户,但要以某种方式将其“分组”,以使父客户与其子客户在一起

结果是这样的

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查询来实现这一点?

相应地进行了更新。从你对问题的描述来看,这应该足够了

请尝试并发布结果,请:

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);

哎呀,经过一点挠头,这似乎正是你想要的

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

实例:

您可以编写一个接近您口头描述的LINQ查询。首先根据父母的id将父母和孩子一起订购,然后根据他们各自的父母之后的id订购孩子

customers.OrderBy(c => c.ParentID > 0 ? c.ParentID : c.CustomerID)
         .ThenBy(c => c.ParentID == 0 ? 0 : c.CustomerID)
这假设您的层次结构只有一个层次(即,作为家长的客户不能同时也是孩子)。我不相信递归操作可以用LINQ表示

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

应该有效。

这里有一个想法,正如您在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);

您能给出示例数据的预期结果吗?据我所知,您有一个字段名为
ParentCustomerID
。您想按
客户ID
列出。每个CustomerID都可以有一些ParentCustomerID,对吗?因此,您可以尝试创建2个linq查询。第一个获取CustomerID,第二个检查CustomerID是否有parentcustomerID。这是一个非常困难的订购要求-你确定你没有真正尝试分组吗?这将更容易这将不会像OP要求的那样-它将把所有
0
家长的客户放在第一位,然后按
Id
订购,你比我快!我们曾经有过一个非常类似的需求,除了ParentCustomerId是null
int?
而不是零。但是相同的解决方案是,
customers.OrderBy(c=>c.ParentCustomerId.HasValue?c.CustomerId:c.ParentCustomerId.Value)这和我以前做的一样。一点也不难。很抱歉在这里说实话:)这应该很好用。谢谢。我已经尝试了第一个.orderBy子句,但它没有给我想要的结果。我猜是。然后我就不见了。我试过其他一些代码,如果你改成{Customer 2-Parent 4},它们就不能正常工作了。谁投了反对票,愿意解释一下原因吗?OP说“把他们分组,让父母和孩子们在一起”。答案不是这样的:如果您将Customer2更改为ParentCustomerID 4。子项列在父项之前。