LINQ: предложение WHERE не работает после GROUPBY AND SELECT - PullRequest
0 голосов
/ 26 февраля 2019

Во-первых, я получаю дебеты (не сгруппированные) из базы данных.

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 не работает должным образом.Он также включает в себя некоторые записи о безналичных переводах.

Я также пытался найти в Интернете, прежде чем спрашивать, но не нашел правильную причину / ответ.

ПРИМЕЧАНИЕ : ВсеЗаписи без денежных переводов имеют идентификатор, отличный от -1.

1 Ответ

0 голосов
/ 26 февраля 2019

В LINQ для объектов оператор напрямую превращается в серию вызовов методов:

Когда вы делаете следующее:

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

Теперь мы достигаем того, что хотим, сначала фильтруем (внутренний вызов), а затем группируемнаши данные.

Надеюсь, это поможет.Кроме того, вы можете прочитать Ключевые слова запроса для более подробной информации о group и where предложениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...