goldfinger
goldfinger

Reputation: 1115

mondodb linq query fails - is it mongodb driver or linq

Admittedly I don't perform lots of LINQ queries. Therefore I'm uncertain whether the problem I see is due to an obvious LINQ blunder or a legitimate Mongo driver problem (I use 10Gen 1.9.2 C# driver). In the below code I get an error indicating invalid where clause for .where(ques => unAnswered...). Code compiles fine but generates runtime error stating "unsupported where clause". Am I up against a driver limitation or is my LINQ bad?

public IEnumerable<QuestionDataModel> getUnanswered(String username, Category cat)
    {

        IQueryable<QuestionDataModel> questions =
                 from e in this.questionCollection.AsQueryable<QuestionDataModel>()
                 where (e.questionCategory == cat)
                 select e;

        IQueryable<AnswerDataModel> answers =
                  from e in this.answerCollection.AsQueryable<AnswerDataModel>()
                  where (e.questionCategory == cat && e.username == username)
                  select e;

        IEnumerable<QuestionDataModel> filteredquestionslist = null;

        if (answers.Count()==0) // it's possible the user has not answered anything
            filteredquestionslist = questions.ToList();
        else
            filteredquestionslist = questions.Where(ques => unAnswered(ques, ref answers)).ToList();
        return filteredquestionslist;

    }

    private bool unAnswered(QuestionDataModel qdm, ref IQueryable<AnswerDataModel> answer_queryable)
    {
        bool retval;
        retval = answer_queryable.Any(ans => ans.questionID == qdm.questionID) ? false:true;
        return retval;
    }

Upvotes: 1

Views: 475

Answers (1)

Ian Mercer
Ian Mercer

Reputation: 39277

You can't combine two collections in a single query like this with MongoDB - there are no join operations in the database. (You also generally can't use your own method like that in LINQ since they don't translate into SQL (or any other database) but that's a separate issue and even if you fixed that it still wouldn't help here. unAnswered question cannot be translated into Mongo a query).

You must either iterate over one collection, performing the other query and yield return the results you want (i.e. the join happens not in the database but on the computer making the query), or you could denormalize the data in some way such that you can query a single collection to get the results. Of if the number of questions is really small you could possibly load them into a list using .ToList() and then operating on that list in memory.

Upvotes: 1

Related Questions