简体   繁体   English

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

[英]LINQ : WHERE clause not working after GROUPBY AND SELECT

Firstly, I am getting Debits(Non-grouped) from the database. 首先,我从数据库中获取借方(非分组)。

var groupingData = await adminService.GetDebitsGrouping();

And then, I am grouping the Debits according to types(Remittance or Non-Remittance). 然后,我要根据类型(汇款或非汇款)对借方进行分组。

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

But it seems that WHERE clause is not working properly. 但是似乎WHERE子句无法正常工作。 It includes some of the Non-Remittance records too. 它也包括一些非汇款记录。

I also tried searching the web before asking but did not find the correct reason/answer. 在询问之前,我也尝试过搜索网络,但是找不到正确的原因/答案。

NOTE : All Non-Remittance records have id other than -1. 注意 :所有非汇款记录的ID均不是-1。

In LINQ to objects, the statement is directly turned into a series of method calls: 在LINQ to对象中,该语句直接转换为一系列方法调用:

When you do the following: 当您执行以下操作时:

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

This gets translated into something like this: 这被翻译成这样的东西:

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

This is not what we want. 这不是我们想要的。 We want to filter myData and then group it instead of grouping the data and then filtering it. 我们要过滤myData然后对其进行分组,而不是对数据进行分组然后对其进行过滤。 So when you change the order: 因此,当您更改订单时:

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

This gets translated into something like this: 这被翻译成这样的东西:

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

Now we are achieving what we want, filter first (innermost call) and then group our data. 现在,我们实现了所需的功能,首先进行过滤(最内部调用),然后对数据进行分组。

Hope this helps. 希望这可以帮助。 Additionally, you can read Query Keywords for more details on group and where clauses 此外,您可以阅读查询关键字以获取有关groupwhere子句的更多详细信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM