LINQ:在GROUPBY和SELECT之后WHERE子句不起作用

时间:2019-02-26 09:11:43

标签: c# linq lambda

首先,我从数据库中获得了未分组的借方。

var groupingData = await adminService.GetDebitsGrouping();

然后,我要根据付款类型(汇款或非汇款)对借方进行分组。

//Grouping non-remittance records
        var groupedCustomerList = groupingData
            .GroupBy(u => new { u.MemberId, u.CurrencyType, u.AccountToPay, u.SortCodeOrBIC })
            .Select(grp => new DebitsGroupingViewModel
            {
                PaymentOutId = grp.FirstOrDefault().PaymentOutId,
                Sector = grp.FirstOrDefault().Sector,
                MemberId = grp.FirstOrDefault().MemberId,
                MemberName = grp.FirstOrDefault().MemberName,
                SupplierName = grp.FirstOrDefault().SupplierName,
                AccountToPay = grp.FirstOrDefault().AccountToPay,
                SortCodeOrBIC = grp.FirstOrDefault().SortCodeOrBIC,
                Transactions = grp.Sum(x => x.Transactions),
                TotalToPay = grp.Sum(x => x.TotalToPay),
                CurrencyType = grp.FirstOrDefault().CurrencyType,
                ClientCurrency = grp.FirstOrDefault().ClientCurrency,
                AccountName = grp.FirstOrDefault().AccountName,
                SupplierId = grp.FirstOrDefault().SupplierId,
                SupplierTypeId = grp.FirstOrDefault().SupplierTypeId,
                PayTypeMasterId = grp.FirstOrDefault().PayTypeMasterId,
                ClientReferenceNumber = grp.FirstOrDefault().ClientReferenceNumber
            })       
            .Where(x => x.PayTypeMasterId.GetValueOrDefault() != -1)
            .ToList();

但是似乎WHERE子句无法正常工作。它也包括一些非汇款记录。

在询问之前,我也尝试过搜索网络,但找不到正确的原因/答案。

注意:所有非汇款记录的ID均不是-1。

1 个答案:

答案 0 :(得分:4)

在LINQ to对象中,该语句直接转换为一系列方法调用:

执行以下操作时:

var result = myData.GroupBy( .. ).Select( .. ).Where( .. ).ToList();

这被翻译成这样:

var result = Enumerable.ToList(
                Enumerable.Where(
                    IGrouping.GroupBy( .. )
                )
            );

这不是我们想要的。我们要过滤myData,然后对其进行分组,而不是对数据进行分组,然后对其进行过滤。因此,当您更改顺序时:

var result = myData.Where( .. ).GroupBy( .. ).Select( .. ).ToList();

这被翻译成这样:

var result = Enumerable.ToList(
                IGrouping.GroupBy(
                    Enumerable.Where( .. )
                )
            );

现在,我们正在实现所需的功能,首先进行过滤(最内部调用),然后对数据进行分组。

希望这会有所帮助。此外,您可以阅读Query Keywords以获得有关groupwhere子句的更多详细信息