2010-05-28 72 views
3

我有以下查询:LINQ到SQL - 加入,计数

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 
      }); 

现在,我需要修改此查询...其他表我是台底交易。我想统计用户上个月和去年创建的交易数量。我试过这样的:

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的例子吗?

+0

“甚至语法不正确”意味着你得到一个错误? – 2010-05-28 07:11:34

+0

“DealsThisYear = dYear”不正确(句法) – 2010-05-28 07:16:29

回答

3

我想找到解决办法here

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

,如果您create an association,您可以编写查询作为

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() 
    });