RavenDBに保存されているオブジェクトの単純なセットがあります。
public class Question
{
public string Id { get; set; }
public DateTime CreatedOn { get; set; }
public ICollection<User> Supporters { get; set; }
public ICollection<Answer> Answers { get; set; }
}
public class Answer
{
public string Id { get; set; }
public bool IsOfficial { get; set; }
}
次に、RavenDBにクエリを実行して、最初にサポーターの数、次に条件(質問に公式の回答がある場合)、および、質問の作成日で並べられた一連の質問を提供します。だから私はクエリを書きました:
var questions = DocumentSession.Query<Question>().AsQueryable();
questions = questions
.OrderByDescending(x => x.Supporters.Count)
.ThenByDescending(x => x.Answers.Any(a => a.IsOfficial)) //EDIT: source of exception
.ThenByDescending(x => x.CreatedOn)
.Take(15);
var result = questions.ToList();
これは例外をスローします:
System.InvalidCastException: Unable to cast object of type 'System.Linq.Expressions.MethodCallExpressionN' to type 'System.Linq.Expressions.MemberExpression'
linq-to-objectsを使用し、最初の行に.ToList()を追加するだけで、クエリは論理的に正しく機能します。
var questions = DocumentSession.Query<Question>().Tolist().AsQueryable();
// next lines stay unchanged
パフォーマンスの問題があるため、これは実行したくありません(この変更により、フィルタリングの前にすべての質問がデータベースからメモリに読み込まれます)。
パフォーマンスに影響を与えずにこれを機能させる方法は?多分シェル私はインデックスを定義しますか?それではどのように見えるべきですか?