Проблема с группой LINQ по счету

Я пытаюсь запустить следующий запрос, но по какой-то причине MemberTransactionCount и NonMemberTransactionCount возвращаются как те же самые значения. Похоже, что предложения .Where() не работают, как мы ожидали бы от них.

Надеясь, кто-то может указать, где я могу ошибиться.

from trans in transactions
orderby trans.TransactionDate.Year , trans.TransactionDate.Month
group trans by new {trans.TransactionDate.Year, trans.TransactionDate.Month}
into grp
select new MemberTransactions
{
    Month = string.Format("{0}/{1}", grp.Key.Month, grp.Key.Year),
    MemberTransactionCount =
        grp.Where(x => x.Account.Id != Guid.Empty || x.CardNumber != null)
           .Sum(x => x.AmountSpent),
    NonMemberTransactionCount =
        grp.Where(x => x.Account.Id == Guid.Empty && x.CardNumber == null)
           .Sum(x => x.AmountSpent)
}

EDIT I've verified in the database that the results are not what they should be. It seems to be adding everything together and not taking into account the Account criteria that we're looking at.

0
nl ja de
Измените выберите новый MemberTransactions в выберите новый , .Sum (x => x.AmountSpent), в , и какие элементы вы получаете в двух свойствах xTransactionCount - это поможет вам отладить проблему.
добавлено автор Rawling, источник
Есть ли у вас данные, в которых оба значения guid и cardNumber равны нулю?
добавлено автор shahkalpesh, источник
Может быть, данные такие, что мы получим тот же результат.
добавлено автор Hamlet Hakobyan, источник
Я не вижу окружающего кода, поэтому могу только догадываться. Можете ли вы бороться с отложенным исполнением LINQ здесь? См. Эту статью, например: Отложенное исполнение </а>
добавлено автор Jens H, источник
@shahkalpesh - Да, мы делаем. Это зависит от того, когда транзакция была обработана.
добавлено автор Matt Millican, источник
@HamletHakobyan Мы проверили в базе данных, что данные должны быть существенно разными. Кажется, что все складывается вместе, вместо того чтобы принять .Where() .
добавлено автор Matt Millican, источник

2 ответы

Я решил решить это двумя отдельными запросами. Это не совсем так, как я хотел, но он выполняет эту работу и, похоже, так же быстро, как я бы надеялся.

var memberTrans = from trans in transactions
              where trans.Account != null
                    || trans.CardNumber != null
              orderby trans.TransactionDate.Month
              group trans by trans.TransactionDate.Month
              into grp
              select new
                  {
                      Month = grp.Key,
                      Amount = grp.Sum(x => x.AmountSpent)
                  };
var nonMemberTrans = (from trans in transactions
                  where trans.Account == null
                        && trans.CardNumber == null
                  group trans by trans.TransactionDate.Month
                  into grp
                  select new
                      {
                          Month = grp.Key,
                          Amount = grp.Sum(x => x.AmountSpent)
                      }).ToList();

var memberTransactions = new List();
foreach (var trans in memberTrans)
{
var non = (from nt in nonMemberTrans
           where nt.Month == trans.Month
           select nt).FirstOrDefault();

var date = new DateTime(2012, trans.Month, 1);
memberTransactions.Add(new MemberTransactions
    {
        Month = date.ToString("MMM"),
        MemberTransactionCount = trans.Amount,
        NonMemberTransactionCount = non != null ? non.Amount : 0.00m
    });
}
1
добавлено

Я думаю, что главная проблема здесь в том, что вы сомневаетесь в результате, хотя это может быть правильно.

Добавить другое свойство для проверки:

TotalAmount = grp.Sum(x => x.AmountSpent)
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot