2011-11-29 35 views
0

我有以下Linq-to-SQL查询。在第5行我试图从我的Packages表中得到我的Where语句中列出的条件满足的记录数。我认为除了第5行外,这段代码中的所有内容都是正确的。我做错了什么?如何在我的Linq中将这个Count语句修复为Sql代码?

var Overage = from s in db.Subscriptions 
    join p in db.Packages on s.UserID equals p.UserID 
    where 
     s.SubscriptionType != "PayAsYouGo" && 
     (s.CancelDate == null || s.CancelDate >= day) && 
     s.StartDate <= day && p.DateReceived <= day && 
     (p.DateShipped == null || p.DateShipped >= day) 
    let AverageBoxSize = (p.Height * p.Length * p.Width)/1728 
    let ActiveBoxCount = p.Count() 
    select new 
    { 
     p, 
     AverageBoxSize, 
     ActiveBoxCount, 
     s.Boxes 
    }; 

错误消息是 “未知方法COUNT()Foo.Data.Package的”

EDIT下面是一个例子陪我的问题:

订阅表:

UserID | Boxes 
001  5 
002  25 
003  5 

方块是每个用户在其订阅下允许的最大数量

套餐表

UserID | PackageID | Height | Length | Width 
001  00001  10  10  10 
001  00002  10  10  10 
001  00003  20  10  10 
003  00004  10  20  20 
003  00005  10  10  10 

所需的查询结果

UserID | Boxes | Box Count | Average Box Size 
001  5   3   1,333 
003  5   2   2,500 

用户002不会出现,因为where子句排除用户

+2

是的,你做错了什么?有错误吗? – leppie

+0

什么是错误? –

+0

运行此收益率是什么?它是否产生错误,0,1,...? – Josh

回答

0

从上Ryan的回答您的意见,这可能是想你想:

var Overage = from s in db.Subscriptions 
    join p in db.Packages on s.UserID equals p.UserID 
    where 
     s.SubscriptionType != "PayAsYouGo" && 
     (s.CancelDate == null || s.CancelDate >= day) && 
     s.StartDate <= day && p.DateReceived <= day && 
     (p.DateShipped == null || p.DateShipped >= day) 
    select new 
    { 
     p, 
     AverageBoxSize = (p.Height * p.Length * p.Width)/1728, 
     ActiveBoxCount = db.Packages.Where(x => x.UserID == p.UserID).Count(), 
     s.Boxes 
    } 
+0

在阅读各种评论时,我认为我的错误是我需要按用户ID对结果进行分组。这就是你的ActiveBoxCount行吗?如果是这样,我还需要修正我的平均尺寸公式,以便总结尺寸的乘积。而且如果不汇总p的所有其他列(可以,因为我不再需要p),我可能无法选择'p'。 – hughesdan

+0

在这种情况下,您需要对所有您当前返回的属性进行分组,但我不确定在s.Boxes'集合上可能会出现这种情况 – Magnus

0

P是不是一个集合。它应该阅读:让ActiveBoxCount = db.Packages.Count()

+0

或者's.Boxes.Count()' – Magnus

+0

@Ryan。谢谢。我需要的计数实际上是每个UserID。但db.Packages.Count()会给我所有用户的总数,对吧? – hughesdan

+0

@Magnus好想法,但那不行。 s.Boxes告诉我根据订阅表允许用户拥有的最大盒子数量。我试图根据包表计算每个用户实际拥有的数量。 – hughesdan

0

这可能比较容易喜欢的东西来取代你让行 -

Group <columns> By UserId into summary = Group 
Aggregate x in summary Into ActiveBoxCount = x.Count