Linq to Entities - 分组两次 - NotSupportedException

时间:2017-12-06 10:09:01

标签: vb.net entity-framework linq

我有一个有两个组的复杂查询,我希望按日期获得每个客户的总销售额。

在这个例子中,我今天和昨天都会收到它们 我正在使用LinqPad来测试我的查询,而且我们目前正在使用VB.NET

这是我的疑问:

dim todayDate = new Date(2016, 7, 25)
dim yesterdayDate = new Date(2016, 7, 24)

Dim forecast = SalesHeaders _
  .Join(Customers, Function(x) x.CustomerID, Function(c) c.CustomerID, Function(SHeader, Customer) New With {SHeader, Customer}) _
  .Join(SalesDetails, Function(s) s.SHeader.HeaderID, Function(sd) sd.HeaderID, Function(SHeader, SDetail) New With {SHeader, SDetail}) _
  .Join(SalesValues, Function(x) x.SDetail.DetailID, Function(sv) sv.DetailID, Function(x, SValue) New With {x.SHeader, x.SDetail, SValue}) _
                .Where(Function(x) x.SValue.Date = todayDate.Date OrElse x.SValue.Date = yesterdayDate.Date) _
  .GroupBy(Function(x) New With {x.SFHeader.Customer.AccountCode}) _
  .Select(Function(g) New With
  {
      .CustomerAccountCode = g.Key,
      .ForecastData = g.GroupBy(Function(x) x.SFValue.Date) _
                      .Select(Function(gg) New With
                      {
                          .Sales = gg.Sum(Function(x) x.SDetail.SalesQty),
                          .Date = gg.Key
                      }).ToList()
  }).ToList().dump()

我得到的例外似乎来自第一个GroupBy。
我得到了NotSupportedException Unable to cast the type 'System.Linq.IGrouping2[[VB$AnonymousType_3 ...] to type 'System.Collections.Generic.IEnumerable1[[VB$AnonymousType_2...] LINQ to Entities仅支持转换EDM原语或枚举类型。

我怀疑由于连接的数量,匿名类型的数量令人困惑。
我想我可能需要在第一个GroupBy之前做一个Select,但我不知道Select会是什么。

当我在第一个GroupBy之后直接放置AsEnumerable()调用然后它工作正常,但我认为是因为AsEnumerable()正在执行查询,所以GroupBys发生在内存中,而不是在数据库上

我希望有一些明亮的火花可以告诉我导致异常的原因以及原因 希望你也可以提出更好的查询。

谢谢: - )

1 个答案:

答案 0 :(得分:1)

Yup,导航属性解决方案对我来说 - 我应该听过这篇文章Don’t use Linq’s Join. Navigate!

我的要求已经更改,我不再需要我最初发布的查询。但这是一个更复杂的查询,与导航属性一起使用,只是表明它们有多重要:
此查询按客户,周和产品类别

获取总销售额
        Dim sales= context.SalesValues _
        .Where(Function(x) x.Date.Year = year AndAlso weekNumbers.Contains(x.SalesForecastingDetail.WeekNumber)) _
        .GroupBy(Function(x) x.SalesHeader.Customer.AccountCode) _
        .Select(Function(g) New CustomerWeekGroup With
        {
            .Sales = g.Sum(Function(x) x.SalesQty),
            .CustomerAccountCode = g.Key,
            .Weeks = g.GroupBy(Function(x) x.SalesDetail.WeekNumber) _
                        .Select(Function(weekGroup) New CustomerWeekCategoryGroup With
                        {
                            .WeekNumber = weekGroup.Key,
                            .Sales = weekGroup.Sum(Function(x) x.SalesQty),
                            .Categories = weekGroup.GroupBy(Function(x) x.SalesHeader.Product.ProductGrouping.ShortCode) _
                                                .Select(Function(categoryGroup) New CategorySalesModel With
                                                {
                                                    .CategoryCode = categoryGroup.Key,
                                                    .Sales = categoryGroup.Sum(Function(x) x.SalesQty)
                                                }).ToList()
                        }).ToList()
        }).ToList()