1

我有一个无法弄清楚的查询问题,我正在代码中执行此查询:

var userList = (from user in this.documentSession.Query<User>()
                            where user.FederatedUserIds[authenticatedClient.ProviderName] == authenticatedClient.UserInformation.Id
                            select user).ToList();

在这种情况下,providername 是 facebook,id = 100001103765630。FederatedUserId 是一个字典。

这导致对服务器的查询:

http://localhost:8080/indexes/dynamic/Users?&query=FederatedUserIds.facebook%3A100001103765630&pageSize=128

这给出了零结果,也来自网络浏览器中的查询:

{
    "Results": [],
    "Includes": [],
    "IsStale": false,
    "IndexTimestamp": "2013-08-24T14:52:44.0511623Z",
    "TotalResults": 0,
    "SkippedResults": 0,
    "IndexName": "Auto/Users/ByFederatedUserIds_facebook",
    "IndexEtag": "01000000-0000-0064-0000-000000000001",
    "ResultEtag": "2BD9AA1E-935A-FEDF-3636-FAB0F155ED9E",
    "Highlightings": {},
    "NonAuthoritativeInformation": false,
    "LastQueryTime": "2013-08-24T15:00:30.1200358Z",
    "DurationMilliseconds": 1
}

虽然我在数据库中有一个类似这样的文档,但我希望得到 1 个结果而不是 0:

{
  "DisplayName": "neographikal",
  "RealName": "x",
  "Email": "x",
  "PictureUri": "x",
  "Roles": [
    "User"
  ],
  "ProfileImages": [],
  "FederatedUserIds": {
    "google": "x",
    "twitter": "x",
    "windowslive": "x",
    "linkedin": "x",
    "facebook": "100001103765630"
  }
}

奇怪的是,这在这段代码中从未让我感到困扰。有人可以看到我在哪里做错了吗?

4

2 回答 2

1

我本来想说你可能有过时的结果,但我明白了"IsStale": false

FederatedUserIds.facebook我看到的唯一另一件事是,当字段名称将出现FederatedUserIds_facebook在索引中时,URL 上的查询就通过了。但是,我对此进行了测试并且它有效,因此它似乎在查询执行之前.被转换为。_我不确定这是什么时候添加的,或者是否一直都是这样。

请注意,如果您尝试.在 Raven Studio 中查询,它在那里不起作用,但_确实如此。

您正在运行什么构建版本?我在 2.5.2666 上进行了测试,它对我有用。

于 2013-08-24T20:23:40.530 回答
1

不知何故,这与索引有关。虽然这是一个自动索引查询,但删除服务器上的所有索引并重新启动应用程序解决了这个问题。我认为这不应该发生,但重现它似乎非常困难。如果我可以在功能中重现它,我会尝试进一步调查。

编辑01-09:

发现问题并创建错误报告:http: //issues.hibernatingrhinos.com/issue/RavenDB-1334

通过创建一个体面的索引来解决它:

public class UserByFederatedLoginIndex : AbstractIndexCreationTask<Core.Domain.User>
    {
        public UserByFederatedLoginIndex()
        {
            Map = users => from u in users
                           select new
                               {
                                   u.DisplayName,
                                   _ = u.FederatedUserIds.Select(x => CreateField("FederatedUserIds_"+x.Key, x.Value))
                               };
        }
于 2013-08-25T00:16:03.477 回答