2

我使用以下查询检索一个集合:

var numbers = _betDetailItem.GetBetDetailItems().Where(betDetailItem => betDetailItem.BetDetail.Bet.DateDrawing == resultToCreate.Date && betDetailItem.BetDetail.Bet.Status == 1).Where(condition);

在那里,我可以访问我的导航属性并浏览绑定的信息。请注意我实际上是如何使用它们来过滤数据的。

在我对结果进行分组后,导航属性变为空。

var grouped = numbers.GroupBy(p => p.BetDetail.Bet);
//Iterate through the collection created by the Grouping
foreach (IGrouping<Bet, BetDetailItem> group in grouped)
{
    var details = group.Key.BetDetails; //This is what doesn't work. BetDetails is a navigation property which was accessible in the previous query. 
}

难道我做错了什么?

4

2 回答 2

1

一旦你做了 a GroupBy(),你就不再和你的实体打交道了——它们已经……好吧,分组了,所以varinvar grouped = ...现在是 type IEnumerable<IGrouping<...。因此,grouped集合中项目可用的方法是IGrouping<>接口的方法。

根据您的需要,您可能想要OrderBy()代替GroupBy(),或者您需要在两个级别上进行迭代:迭代 中的每个组grouped,以及每个组中的每个成员。

一旦你在一个特定的内部IGrouping<>,你应该可以访问你正在寻找的属性。

于 2010-02-11T20:27:59.323 回答
1

您正在混淆 LINQ to Entities 和对象操作。

这是 LINQ to Entity:

var numbers = _betDetailItem.GetBetDetailItems().Where(betDetailItem => betDetailItem.BetDetail.Bet.DateDrawing == resultToCreate.Date && betDetailItem.BetDetail.Bet.Status == 1).Where(condition);

这是这样的:

var grouped = numbers.GroupBy(p => p.BetDetail.Bet);

这些是对象操作:

foreach (IGrouping<Bet, BetDetailItem> group in grouped)
{
    var details = group.Key.BetDetails; //This is what doesn't work. BetDetails is a navigation property which was accessible in the previous query. 
}

在 LINQ to Entities 中,永远不需要考虑加载相关实例。您始终可以引用任何对象的任何属性。但是,在某些时候,您想要离开 LINQ to Entities 世界并进入对象空间,因为您想要使用 type 的实例BetDetail而不是 type IQueryable<BetDetail>。这意味着现在需要实体框架来生成 SQL 以从数据库中检索数据。那时,您稍后将在代码中访问哪些相关实例并不会下雪。LINQ to Entities 查询中的任何内容都不会强制加载相关的Bet. 因此,除非您采取措施使其被加载,例如使用急切加载、显式加载或 EF 4 延迟加载,否则它不会被加载。

使用延迟加载(例如,在 Entity Framework 4 中,或在另一个 ORM 中)将使此代码看起来可以运行,但由于生成了大量的数据库查询,它会不必要地变慢。更好的解决方案是使用急切加载投影。这样就只有一个数据库往返。

于 2010-02-12T18:14:47.503 回答