ravendb linq查询不使用overriden equals方法?

时间:2014-06-24 15:16:34

标签: c# linq ravendb hashcode equality

这有效:

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是否使用不同的等式检查?

1 个答案:

答案 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子句,并仅将减少的记录结果集返回给您。