不可否认,我不会执行大量LINQ查询。因此,我不确定我看到的问题是由于明显的LINQ错误还是合法的Mongo驱动程序问题(我使用10Gen 1.9.2 C#驱动程序)。在下面的代码中,我收到一个错误,指示.where(ques => unAnswered ...)的无效where子句。代码编译正常,但会生成运行时错误,指出“不支持的where子句”。我是对抗司机限制还是我的LINQ不好?
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;
}
答案 0 :(得分:1)
您无法将单个查询中的两个集合与MongoDB组合在一起 - 数据库中没有连接操作。 (你通常也不能像在LINQ那样使用自己的方法,因为它们不能翻译成SQL(或任何其他数据库),但这是一个单独的问题,即使你修复了它仍然不会#39; t help here。unAnswered
问题无法翻译成Mongo查询)。
您必须迭代一个集合,执行另一个查询并返回您想要的结果(即,连接不在数据库中,而是在进行查询的计算机上),或者您可以以某种方式对数据进行非规范化您可以查询单个集合以获取结果。如果问题的数量非常小,您可以使用.ToList()
将它们加载到列表中,然后在内存中对该列表进行操作。