2

问候,

考虑到 Northwind 示例表 Customers、Orders 和 OrderDetails,我希望预先加载与上述表对应的相关实体,但在获取实体之前我需要对数据库中的子实体进行排序。

基本情况:

var someQueryable = from customer in northwindContext.Customers.Include("Orders.OrderDetails") 
select customer;

但我还需要针对这些表上的一些随机列在数据库端(在将这些实体提取到内存之前)对 Orders 和 OrderDetails 进行排序。是否有可能没有一些投影,就像在 T-SQL 中一样?解决方案是使用 e-SQL 还是 LINQ to Entities 并不重要。我搜索了网络,但我对找到的答案并不满意,因为它们主要涉及将数据投影到某个匿名类型,然后重新查询该匿名类型以按照您喜欢的顺序获取子实体。同样使用 CreateSourceQuery() 对我来说似乎不是一个选项,因为我需要获取数据库端的数据,通过急切加载但只需订购子实体。那就是我想在执行任何查询之前执行“ORDER BY”,然后按我想要的顺序获取实体。提前感谢您的任何指导。作为个人说明,请原谅直接语言,因为我对微软以如此不成熟的形式发布 EF 感到有点生气,即使与 Linq to SQL 相比(他们似乎正在慢慢摆脱)。我希望这个 EF 东西会变得更好,并且在 .NET FX 4.0 的发布版本中没有重大错误。

4

3 回答 3

8

实际上我有提示可以解决这个问题。

不“支持”对相关实体进行排序,但使用 Craig 展示的投影方法依靠称为“Relationship Fixup”的东西,您可以获得非常相似的工作:

如果你这样做:

var projection = from c in ctx.Customers
                 select new {
                       Customer = c, 
                       Orders = c.Orders.OrderByDescending( 
                                 o => o.OrderDate 
                             )
                 };

foreach(var anon in projection )
{
   anon.Orders //is sorted (because of the projection)
   anon.Customer.Orders // is sorted too! because of relationship fixup
}

这意味着如果你这样做:

var customers = projection.AsEnumerable().Select(x => x.Customer);

您将拥有已排序订单的客户!

有关更多信息,请参阅提示。

希望这可以帮助

亚历克斯

于 2009-06-15T18:51:16.383 回答
2

你混淆了两个不同的问题。第一个是如何在数据库中实现实体,第二个是如何检索有序列表。EntityCollection 类型不是有序列表。在您的示例中,customer.Orders 是一个 EntityCollection。

另一方面,如果您想按特定顺序获取列表,您当然可以这样做;它只是不能在 EntityCollection 类型的属性中。例如:

from c in northwindContext.Customers
orderby c.SomeField
select new {
    Name = c.Name,
    Orders = from o in c.Orders
             orderby c.SomeField
             select new {
                SomeField = c.SomeField
             }
}

请注意,没有调用 Include。因为是投影所以没必要。

实体框架可能无法以您期望的方式工作,来自 LINQ to SQL 背景,但它确实有效。在你理解它之前小心地谴责它;决定它不起作用会阻止你了解它是如何工作的。

于 2009-06-15T18:18:39.163 回答
0

谢谢你们俩。我知道我可以使用投影来实现我想要的,但我认为可能有一种简单的方法可以做到这一点,因为在 T-SQL 世界中,通过一些嵌套查询(或连接)和 order bys 完全有可能。另一方面,关注点的分离听起来很合理,我们现在处于实体域中,所以我将使用你们两个推荐的方式,尽管我不得不承认,使用 AssociateWith 在 LINQ to SQL 中实现这一点更容易、更清晰。

亲切的问候。

于 2009-06-15T21:00:38.790 回答