我有一个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查询来实现这一目标?
答案 0 :(得分:3)
哇,经过一番头疼之后,这似乎完全符合您的目标
var ordered = customers.OrderBy(c => c.ParentCustomerId == 0 ? c.CustomerId : c.ParentCustomerId)
.ThenBy(c => c.CustomerId);
答案 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);
应该工作。