这有效:
IQueryable<Record> query = _db.Query<Record>()
.Statistics(out stats)
.Where(r => r.Keywords.Any(
k => k.Value.Equals(searchInputModel.Keyword.Value)));
但这不是
IQueryable<Record> queryBorked = _db.Query<Record>()
.Statistics(out stats)
.Where(r => r.Keywords.Any(
k => k.Equals(searchInputModel.Keyword)));
即使我已经覆盖了Keyword类的equals和hashcode,如下所示,所以只检查value是否相等:
protected bool Equals(Keyword other)
{
return string.Equals(Value, other.Value, StringComparison.InvariantCultureIgnoreCase);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Keyword) obj);
}
和哈希码:
public override int GetHashCode()
{
unchecked
{
return (Value.ToLower().GetHashCode() * 397);
//return (Value.ToLower().GetHashCode()*397) ^ Vocab.ToLower().GetHashCode();
}
}
ravendb是否使用不同的等式检查?
答案 0 :(得分:3)
RavenDB在数据库端使用它自己的类似Linq的实现(Query返回IRavenQueryable而不是&#34;普通&#34; .NET Queryable对象),因此无法使用被覆盖的在您的查询中实现。
以下方法可行:
IQueryable<Record> queryBorked = _db.Query<Record>()
.Statistics(out stats)
.ToList()
.Where(r => r.Keywords.Any(
k => k.Equals(searchInputModel.Keyword)));
注意&#34; ToList()&#34;。这将返回所有记录的结果,然后您可以使用.NET Linq实现进一步减少这些记录,因此也可以覆盖Equals实现。
请注意,这将返回数据库中的所有记录数据,并且您正在使用where子句在代码中进一步减少数据。而您的第一个工作示例将执行数据库中的where子句,并仅将减少的记录结果集返回给您。