Как мне исправить это выражение Count в моем коде Linq to Sql? - PullRequest
0 голосов
/ 29 ноября 2011

У меня следующий запрос Linq-to-SQL. В строке № 5 я пытаюсь получить количество записей из моей таблицы «Пакеты», где выполнены условия, перечисленные в моем утверждении «Где». Я думаю, что все правильно в этом коде, за исключением строки № 5. Что я сделал не так?

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»

РЕДАКТИРОВАТЬ Вот пример, чтобы сопровождать мой вопрос:

Таблица подписки:

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 исключает этого пользователя

Ответы [ 3 ]

0 голосов
/ 29 ноября 2011

Из ваших комментариев к ответу Райана, это может быть, вы хотите:

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 голосов
/ 29 ноября 2011

Возможно, проще всего заменить строку Let на что-то вроде -

Group <columns> By UserId into summary = Group 
Aggregate x in summary Into ActiveBoxCount = x.Count
0 голосов
/ 29 ноября 2011

P не является коллекцией. Должно быть написано: let ActiveBoxCount = db.Packages.Count ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...