2 ado.net entity entity-framework
问候,
考虑到Northwind样本表Customers,Orders和OrderDetails,我想急切加载与上述表相对应的相关实体,但我需要在获取实体之前对数据库中的子实体进行排序.
基本情况:
var someQueryable = from customer in northwindContext.Customers.Include("Orders.OrderDetails")
select customer;
Run Code Online (Sandbox Code Playgroud)
但我还需要在数据库一侧对Orders和OrderDetails进行排序(在将这些实体提取到内存之前)与这些表上的一些随机列相关.是否有可能没有一些投影,就像它在T-SQL中一样?解决方案是使用e-SQL还是LINQ to Entities无关紧要.我在网上搜索但我对我找到的答案不满意,因为他们主要涉及将数据投影到某个匿名类型,然后重新查询匿名类型以按照您喜欢的顺序获取子实体.同样使用CreateSourceQuery()对我来说似乎不是一个选项,因为我需要在数据库端获取数据,只需通过预先加载,但只需订购子实体.那就是我想在执行任何查询之前执行"ORDER BY",然后按照我想要的顺序获取实体.提前感谢任何指导.作为一个个人注释,请原谅直接语言,因为我有点生气,即使与Linq to SQL(他们似乎慢慢走开)相比,微软也因为这种不成熟的形式发布了EF.我希望这个EF的东西会更好,并且在.NET FX 4.0的发布版本中没有明显的错误.
实际上我有Tip解决了这个问题.
不支持对相关实体进行排序,但使用投影方法Craig显示并依赖于称为"关系修正"的东西,您可以获得非常类似的工作:
如果你这样做:
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
}
Run Code Online (Sandbox Code Playgroud)
这意味着如果你这样做:
var customers = projection.AsEnumerable().Select(x => x.Customer);
Run Code Online (Sandbox Code Playgroud)
您将拥有已排序的客户!
有关详细信息,请参阅提示.
希望这可以帮助
亚历克斯