C# 开启条件下2个字段的Linq顺序
我有一个CustomerID和ParentCustomerID的客户列表,其中ParentCustomerID指的是另一个客户的CustomerID 我想要的是按ParentCustomerID或CustomerID(如果ParentCustomerID为0)对客户列表进行排序,其想法是我想要列出我的所有客户,但要以某种方式将其“分组”,以使父客户与其子客户在一起 结果是这样的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
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是nullint?
而不是零。但是相同的解决方案是,customers.OrderBy(c=>c.ParentCustomerId.HasValue?c.CustomerId:c.ParentCustomerId.Value)代码>这和我以前做的一样。一点也不难。很抱歉在这里说实话:)这应该很好用。谢谢。我已经尝试了第一个.orderBy子句,但它没有给我想要的结果。我猜是。然后我就不见了。我试过其他一些代码,如果你改成{Customer 2-Parent 4},它们就不能正常工作了。谁投了反对票,愿意解释一下原因吗?OP说“把他们分组,让父母和孩子们在一起”。答案不是这样的:如果您将Customer2更改为ParentCustomerID 4。子项列在父项之前。