【问题标题】:Adding WHERE statements to a LINQ lambda expression将 WHERE 语句添加到 LINQ lambda 表达式
【发布时间】:2018-01-25 04:37:39
【问题描述】:

我在这里使用的两个表是这样构建的:

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'...

【问题讨论】:

  • 在调用之前将它们移动到GroupBy()。在分组调用之后,您处理的是组对象,而不是您的项目。

标签: c# linq lambda


【解决方案1】:

在应用条件之前不要分组:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多