【发布时间】:2012-11-18 23:25:39
【问题描述】:
我在 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
由于性能问题,我不想这样做(此更改强制在过滤之前将所有问题从数据库加载到内存中)。
如何在不影响性能的情况下使其工作?也许 shell 我定义了一个索引?那么它应该是什么样子呢?
【问题讨论】:
-
您是否尝试过不使用
ToList()或.AsQueryable()的查询,例如:var questions = DocumentSession.Query<Question>().OrderByDescending(); -
在哪一行抛出异常?是否会在调用 ToList() 时发生,或者当您尝试访问 Count of Supporters,或调用 Any() 或其他地方时会发生这种情况吗?我同意 MGA 的观点,即不需要 .AsQueryable()。我也认为 Count 和 Any() 的索引是个好主意。
-
@Bear Alexander:我已经编辑了问题并指出了错误的来源。 AsQueryable() 确实不需要。索引线索似乎很有趣。您可以根据我的情况发布这样的索引示例,以及保留我的逻辑并返回所需结果的修改后的查询吗?