考虑下面的数据表
Customers -> Orders -> Items
Customers ->
A
B
C
Orders ->
o1 - A,
o2 - A,
o3 - B,
o4 - C
OrderItems ->
o1 - Item1,
o1 - Item2,
o2 - Item3,
o3 - Item2,
o4 - Item1
Item ->
Item1,
Item2,
Item3,
Item4
我们在数据库中有类似的映射。 现在在linq我想获得按逗号分隔的项目排序的客户列表 例如:
Customer Items
C Item1
A Item1, Item2
B Item2
我尝过这样的事情
Customer.OrderBy( cust => string.Join(",", cust.Orders
.SelectMany( order=>order.OrderItems)
.Select( orderItem=> orderItem.Item.Name)
.OrderBy(item=>item)));
但是linq语句中不允许使用string.Join .. 它不需要在我的网格中显示项目,但我需要让客户按逗号分隔的项目排序..
而且我也不希望在UI级别完成此操作,因为需要在IQueryable客户对象上进行排序,其他过滤器将添加到其中,然后再执行。 使用IQueryable Customer对象的linq orderby查询,返回IQueryable对象。
答案 0 :(得分:0)
当您查询Customer集合时,您的查询将转换为sql指令。由于您提到了其他过滤器,我认为它是一个很大的表,您不想显示/获取所有行。
即使在EF中允许使用string.Join运算符,您的order子句也会运行一个复杂的语句,需要为每一行处理以确定正确的结果顺序(请参阅this question for an example你的string.join会做什么)。
您需要以某种方式简化您的订单子句或将项目列表字符串存储到sql字段中。如果您不能存储此字符串,则可以尝试使用linq创建存储过程,视图或处理数据(在这种情况下,使用EF应用所有过滤器,使用.ToList()获取结果使用常规linq将您的订单过滤器应用于对象。)
请注意,如果您不简化查询并且客户表很大,you'll face some performance issues。