【问题标题】:RavenDB LINQ Query no longer works with new stable build (#616)RavenDB LINQ 查询不再适用于新的稳定版本 (#616)
【发布时间】:2013-04-15 11:24:50
【问题描述】:

我正在使用RavenDBMembership Provider,在尝试了最新的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 内部发生了什么...

【问题讨论】:

    标签: linq ravendb


    【解决方案1】:

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

    如果不是这种情况,我们将感谢一个失败的测试用例。

    编辑:

    废话! 原因是你的文件被命名为“raven/...”

    并且以 Raven/ 为前缀的文档不会被索引。

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

    不要使用 Raven/ 前缀命名您的文档,这是为系统文档保留的。

    【讨论】:

    • 谓词在这种情况下是null,因此流程转到else语句...我如何为您准备一个失败的测试用例?我很乐意帮助追踪问题所在...
    • 有点相关,但由于您的结果局部变量被声明为 IEnumerable,因此您正在内存中执行 Count、Skip 和 Take 调用(不确定这是否是原因)。即使没有应用 Where 子句,您也有效地完成了 AsEnumerable :) 我可能会尝试注释掉它的声明和 if/else 位,然后留下 'var results = q;'看看这是否会改变行为。
    • @James:感谢您的光临和评论。我也考虑过这一点,只是为了测试:totalRecords = q.Count();,但它仍然返回 0... 应该返回 2。RavenDB 中的某些东西被破坏了,因为正如我在问题中提到的那样,这个查询在稳定构建 #573 上工作得很好.
    • Leniel,请创建一个失败的测试并将其发送到邮件列表。
    • Ayende,我已将我当前的代码上传到 groups.google.com/d/msg/ravendb/B-7JidmIYz4/xqTS367fNQUJ,以便您调试它并查看发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2012-06-17
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多