我有一个有两个组的复杂查询,我希望按日期获得每个客户的总销售额。
在这个例子中,我今天和昨天都会收到它们 我正在使用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发生在内存中,而不是在数据库上
我希望有一些明亮的火花可以告诉我导致异常的原因以及原因 希望你也可以提出更好的查询。
谢谢: - )
答案 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()