LINQ-to-SQL - объединение, подсчет - PullRequest
3 голосов
/ 28 мая 2010

У меня следующий запрос:

var result = (
             from role in db.Roles
             join user in db.Users on role.RoleID equals user.RoleID                         
             where
                 user.CreatedByUserID == userID                             
             orderby user.FirstName ascending
             select new UserViewModel
             {
                 UserID = user.UserID,
                 PhotoID = user.PhotoID.ToString(),
                 FirstName = user.FirstName,
                 LastName = user.LastName,
                 FullName = user.FirstName + " " + user.LastName,
                 Email = user.Email,
                 PhoneNumber = user.Phone,
                 AccessLevel = role.Name
             });

Теперь мне нужно изменить этот запрос ... Другая таблица, которую я имею, это таблица Deals. Я хотел бы посчитать, сколько сделок пользователь создал в прошлом месяце и в прошлом году. Я пробовал что-то вроде этого:

var result = (
             from role in db.Roles
             join user in db.Users on role.RoleID equals user.RoleID
             //join dealsYear in db.Deals on date.Year equals dealsYear.DateCreated.Year
             join dealsYear in
                 (
                         from deal in db.Deals
                         group deal by deal.DateCreated into d
                         select new { DateCreated = d.Key, dealsCount = d.Count() }
                 ) on date.Year equals dealsYear.DateCreated.Year into dYear
             join dealsMonth in
                 (
                         from deal in db.Deals
                         group deal by deal.DateCreated into d
                         select new { DateCreated = d.Key, dealsCount = d.Count() }
                 ) on date.Month equals dealsMonth.DateCreated.Month into dMonth
             where
                 user.CreatedByUserID == userID                 
             orderby user.FirstName ascending
             select new UserViewModel
             {
                 UserID = user.UserID,
                 PhotoID = user.PhotoID.ToString(),
                 FirstName = user.FirstName,
                 LastName = user.LastName,
                 FullName = user.FirstName + " " + user.LastName,
                 Email = user.Email,
                 PhoneNumber = user.Phone,
                 AccessLevel = role.Name,
                 DealsThisYear = dYear,
                 DealsThisMonth = dMonth
             });

но здесь даже синтаксис неправильный. Есть идеи?

Кстати, есть ли хорошая книга LINQ to SQL с примерами?

Ответы [ 2 ]

3 голосов
/ 28 мая 2010

Я думаю, что нашел решение здесь :

var result = (
             from role in db.Roles
             join user in db.Users on role.RoleID equals user.RoleID
             join deal in db.Deals on user.UserID equals deal.SalesAgentID into deals                 
             where
                 user.CreatedByUserID == userID
             orderby user.FirstName ascending
             select new UserViewModel
             {
                 UserID = user.UserID,
                 PhotoID = user.PhotoID.ToString(),
                 FirstName = user.FirstName,
                 LastName = user.LastName,
                 FullName = user.FirstName + " " + user.LastName,
                 Email = user.Email,
                 PhoneNumber = user.Phone,
                 AccessLevel = role.Name,
                 DealsThisYear = deals.Where(deal => deal.DateCreated.Year == date.Year).Count()
             });
2 голосов
/ 28 мая 2010

Если вы создадите ассоциацию , вы можете написать запрос как

IQueryable<UserViewModel> result =
  from user in db.Users
  where user.CreatedByUserID == userID 
  orderby user.FirstName ascending 
  select new UserViewModel
  { 
    UserID = user.UserID, 
    PhotoID = user.PhotoID.ToString(), 
    FirstName = user.FirstName, 
    LastName = user.LastName, 
    FullName = user.FirstName + " " + user.LastName, 
    Email = user.Email, 
    PhoneNumber = user.Phone, 
    AccessLevel = user.Role.Name, 
    DealsThisYear = user.Deals
      .Where(deal => deal.DateCreated.Year == date.Year).Count()
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...