2017-08-16 88 views
4

兩個表,我在這裏工作是建立這樣的:添加WHERE語句到LINQ lambda表達式

Users Table        PurchaseLog Table 

ID| LDAP| FNAME| LNAME|     ID| UserID| PurchaseID | LOCATION |TIME 

我試圖建立一個查詢,讓我回每個用戶的數量購買他們有。我想這個模型來填補:

public class UserPurchaseCount{ 
    public string LDAP {get; set;} 
    public int Count {get; set;} 
} 

這SQL查詢我寫的似乎返回正確的結果,

Select Users.LDAP, count(*) as Purchases 
FROM Users 
JOIN PurchaseLog ON PurchaseLog.UserId=Users.ID 
WHERE Users.FName NOT LIKE '%name%' 
AND PurchaseLog.CreatedDate <= 'some end date' 
AND Purchase.CreatedDate >= 'some start date' 
GROUP BY Users.LDAP 

我吸在lambda表達式,但我喜歡他們,並希望得到一個更好地理解他們。這是我到目前爲止:

 var items = db.PurchaseLogs 
       .Join(db.Users, usr => usr.UserId, x => x.ID, (usr, x) => new { usr, x }) 
       .GroupBy(y => new { y.x.LDAP}) 
       //.Where(i => i.CreatedDate >= startDate) 
       //.Where(i => i.CreatedDate <= endDate) 
       //.Where(i => i.FName.Contains("Guy1", StringComparison.CurrentCultureIgnoreCase) == false) 
       .Select(g => new 
       { 
        g.Key.LDAP, 
        Count = g.Count() 
       }) 

       .ToList(); 

這個lambda表達式的工作原理。當我取消註釋WHERE子句時,編譯器會拋出我的臉。

Error 6 'System.Linq.IGrouping<AnonymousType#2,AnonymousType#3>' does not contain a definition for 'FName'... 
+2

調用'的GroupBy()'之前移動它們。在羣組之後,你正在處理組對象,而不是你的項目。 –

回答

2

別組之前,報考條件:

var items =db.PurchaseLogs 
      .Join(db.Users, usr => usr.UserId, x => x.ID, (usr, x) => new { usr, x }) 
      .Where(i => i.user.CreatedDate >= startDate) 
      .Where(i => i.user.CreatedDate <= endDate) 
      .Where(i => !i.x.FName.Contains("Guy1")) 
      .GroupBy(y => new { y.x.LDAP}) 
      .Select(g => new 
         { 
          g.Key.LDAP, 
          Count = g.Count() 
          }) 

      .ToList();