我正在使用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内部发生了什么......
答案 0 :(得分:2)
问题是:Func<User, bool> predicate
您将它传递给Query.Where,您实际上是在 memory 中进行评估。
您需要使用Expression<Func<User, bool>>
来实际成为可以作为查询处理的linq语句。
如果情况并非如此,我们将非常感谢测试失败。
修改强>
布拉赫! 原因是您的文档被命名为“raven / ...”
以Raven /为前缀的文档未编入索引。
之前,我们为此进行了区分大小写的匹配,现在我们进行不区分大小写的匹配。
请勿使用Raven /前缀为系统文档保留文件。