1

考虑下表的数据

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 客户对象的 linq orderby 查询,返回一个 IQueryable 对象。

4

1 回答 1

0

当您查询 Customer 集合时,您的查询将被转换为 sql 指令。既然你提到了其他过滤器,我想这是一个大表,你不想显示/获取所有行。

即使在 EF 中也允许使用 string.Join 运算符,您的 order 子句对需要为每一行进行处理以确定正确的结果顺序的复杂语句进行操作(有关您的 string.join 将执行的操作的示例,请参见此问题)。

您需要以某种方式简化您的订单子句或将项目列表字符串存储到 sql 字段中。如果您无法存储此字符串,您可以尝试使用 linq 创建存储过程、视图或处理数据到对象(在这种情况下,使用 EF 应用所有过滤器,使用 .ToList() 获取结果并应用您的使用常规 linq 到对象的顺序过滤器)。

请注意,如果您不简化查询并且客户表很大,您将面临一些性能问题

于 2013-05-17T13:03:51.803 回答