【发布时间】:2012-12-07 00:45:25
【问题描述】:
我有以下型号:
public class Clip {
public Guid ClipId { get; set; }
public IList<StateChange> StateChanges { get; set; }
}
public class StateChange {
public string OldState { get; set; }
public string NewState { get; set; }
public DateTime ChangedAt { get; set; }
}
这就是查询乌鸦的方式:
var now = DateTime.UtcNow;
var since = now.AddSeconds(60);
string state = "some state of interest";
using (var session = docStore.OpenSession()) {
RavenQueryStatistics stats;
session.Query<Clip>()
.Statistics(out stats)
.Where(
p => p.StateChanges.Any(a => (since > a.ChangedAt && a.NewState == state))
&& !p.StateChanges.Any(a => (a.OldState == state && now > a.ChangedAt)))
.ToArray();
return stats.TotalResults;
}
我想获取所有在since 和NewState 之前具有(StateChange.CreatedAt 和"some state of interest")并且在now 和@987654330 之前没有(StateChange.CreatedAt 的记录的计数@ 是 "some state of interest")。
虽然上面使用的谓词在 linq to object 中有效,但它似乎在 linq to raven 中无效(即不返回预期结果)。我怀疑这是因为如果左侧的表达式评估为真,则永远不会评估表达式 && !.p.StateChanges.Any....。有没有办法解决这个问题?
【问题讨论】:
-
“不起作用”是什么意思?有错误吗?
-
不,这意味着它没有返回预期的结果,即忽略右侧表达式
-
你怎么知道它忽略了它?如果第一个条件为真,它必须评估正确的条件才能得到整个条件结果。
-
@AmiramKorach 是的,这就是您在处理对象集合时所做的事情。但情况并非如此,谓词被转换为 Lucene 查询字符串。