RavenDB LINQ查询不再适用于新的稳定版本(#616)

时间:2012-02-02 13:48:29

标签: linq ravendb

我正在使用RavenDBMembership提供程序,在尝试最新的RavenDB new stable build (#616)一个LINQ查询后,它就停止了工作。这是方法:

private MembershipUserCollection FindUsers(
      Func<User, bool> predicate, int pageIndex, int pageSize, out int totalRecords)
{
    var membershipUsers = new MembershipUserCollection();

    using (var session = DocumentStore.OpenSession())
    {
        var q = from u in session.Query<User>()
                where u.ApplicationName == ApplicationName //ApplicationName="MyApp"
                select u;

        IEnumerable<User> results;

        if (predicate != null)
        {
            results = q.Where(predicate);
        }
        else
        {
            results = q;
        }

        totalRecords = results.Count(); // Returns 0 but I do have 2 Users in the DB.

        // I also tried executing the query directly:
        // totalRecords = q.Count(); // Returns 0 but I do have 2 Users in the DB.

        var pagedUsers = results.Skip(pageIndex * pageSize).Take(pageSize);

        foreach (var user in pagedUsers)
        {
            membershipUsers.Add(UserToMembershipUser(user));
        }
    }
    return membershipUsers;
}

上面的LINQ查询使用我正在使用的先前版本的RavenDB正确返回用户(#573)。为了测试这个,我删除了NuGet包(#616)并安装了旧的(#573)并且查询正常...

如果我打开RavenDB Studio,我可以看到我已正确地将用户和角色添加到数据库中。

这是用户数据:

{
  "ApplicationName": "MyApp",
  "Username": "leniel",
  "PasswordHash": "/L/7jv82VBSBeCDjH/gbwaKGQZGTV6na2FDiJpt6VDE=",
  "PasswordSalt": "/14i7C==",
  "FullName": null,
  "Email": "leniel@gmail.com",
  "DateCreated": "2012-02-02T05:02:22.0615234",
  "DateLastLogin": null,
  "Roles": [],
  "PasswordQuestion": null,
  "PasswordAnswer": null,
  "IsLockedOut": false,
  "IsOnline": false,
  "FailedPasswordAttempts": 0,
  "FailedPasswordAnswerAttempts": 0,
  "LastFailedPasswordAttempt": "0001-01-01T00:00:00.0000000",
  "Comment": null,
  "IsApproved": true
}

这是用户元数据:

{
  "Raven-Entity-Name": "Users",
  "Raven-Clr-Type": "RavenDBMembership.User, RavenDBMembership"
}

这就是创建用户的方式:

public User()
{
   Roles = new List<string>();
   Id = "raven/authorization/users/"; // db assigns id
}

我读了latest build page但找不到理由。是否有任何我不知道的突然变化?

现在我必须在这个特定的MembershipProvider项目中坚持使用稳定版本#573,因为我不知道RavenDB内部发生了什么......

1 个答案:

答案 0 :(得分:2)

问题是:Func<User, bool> predicate 您将它传递给Query.Where,您实际上是在 memory 中进行评估。 您需要使用Expression<Func<User, bool>>来实际成为可以作为查询处理的linq语句。

如果情况并非如此,我们将非常感谢测试失败。

修改

布拉赫! 原因是您的文档被命名为“raven / ...”

以Raven /为前缀的文档未编入索引。

之前,我们为此进行了区分大小写的匹配,现在我们进行不区分大小写的匹配。

请勿使用Raven /前缀为系统文档保留文件。