user3857731
user3857731

Reputation: 659

In c# linq is it possible to assign value inside anonymous select

This is my code :

   userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => new
                {
                    correctAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count(),
                    incorrectAnswersCount = 80 -  correctAnswersCount
                })

Is it possible to get correctAnswersCount value inside the select and use it for other variables? For example now i am calculating correctAnswersCount twice because above code doesn't work :

  userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => new
                {
                    correctAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count(),
                    incorrectAnswersCount =  80 - uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count(),
                })

Upvotes: 0

Views: 644

Answers (4)

MakePeaceGreatAgain
MakePeaceGreatAgain

Reputation: 37113

You can use an anoymous block of code like this:

userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => 
{
    var corrAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
    return new 
    {
        correctAnswersCount = corrAnswersCount,
        incorrectAnswersCount = 80 -  corrAnswersCount
    }
})

Alternatively if you like the query-syntax more:

userQuizzes = from quiz in user.UserQuizes
              order by quiz.VerbalQuizStartDate
              let count = quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count()
              select new 
              {
                  correctAnswersCount = count,
                  incorrectAnswersCount = 80 - count
              }

Upvotes: 3

MNie
MNie

Reputation: 1367

You can store any temporary results in variables into the body of lambda function, for example:

userQuizzes = user.UserQuizes
               .OrderBy(uq => uq.VerbalQuizStartDate)
               .Select(uq => 
                           { 
                               var count = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
                               //var temp2 = other calculations or something if You want...;
                               return new
                               {
                                   correctAnswersCount = count,
                                   incorrectAnswersCount =  80 - count
                               }
                           }
               );

Upvotes: 1

Domysee
Domysee

Reputation: 12854

You can use a lambda function, in which you can calculate correctAnswersCount before creating the anonymous object, and then use it for both properties:

userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => {
    var correctAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
    return new 
    {
        correctAnswersCount = correctAnswersCount ,
        incorrectAnswersCount = 80 - correctAnswersCount
    };
});

Upvotes: 0

Kirill Bestemyanov
Kirill Bestemyanov

Reputation: 11964

You can use do:

userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq =>
{ 
       var count = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
       return new
                    {
                        correctAnswersCount = count,
                        incorrectAnswersCount = 80 -  count
                    }
});

Upvotes: 1

Related Questions