【问题标题】:Linq query to get data from a specific RavenDB collection not working as expected用于从特定 RavenDB 集合获取数据的 Linq 查询未按预期工作
【发布时间】:2015-07-22 12:42:13
【问题描述】:

所以我使用了一个 RavenDB 数据库,它包含两个不同的集合来将图片对象存储为文档。第一个集合名为 Pictures,第二个集合名为 DeletedPictures。

在此应用程序中,用户可以删除自己的图片。然后将删除的图片对象放入第二个集合 DeletedPictures。我通过更改 RavenDB 文档元数据来做到这一点:

Session.Advanced.GetMetadataFor(picture)[Constants.RavenEntityName] = "DeletedPictures";

我在进行查询以从 DeletedPictures 集合中检索文档时遇到问题。

目前我正在使用两个利用 Linq 查询来检索图片文档的函数,一个用于检索所有已删除的图片;

    public IEnumerable<Picture> RetrieveAllDeleted()
    {
        var allDeletedPictures = Session.Query<Picture>()
                                        .AsEnumerable()
                                        .Where(p => Session.Advanced.GetMetadataFor(p)
                                            .Value<string>("Raven-Entity-Name") == "DeletedPictures");
        return allDeletedPictures;
    }

还有一个用于检索特定用户的所有已删除图片;

    public IEnumerable<Picture> RetrieveAllDeletedOfUser(int userId)
    {
        var allDeletedPicturesOfUser = Session.Query<Picture>()
                                                .Where(p => p.Owner == userId)
                                                .AsEnumerable()
                                                .Where(p => Session.Advanced.GetMetadataFor(p)
                                                    .Value<string>("Raven-Entity-Name") == "DeletedPictures");
        return allDeletedPicturesOfUser;
    }

发现我必须在我的 Linq 链中使用 .AsEnumerable() 否则我会收到错误:

无法理解如何翻译值 Session.Advanced.GetMetadataFor(p).Value("Raven-Entity-Name")

假设 Pictures 集合包含 2 个文档,DeletedPictures 集合包含 6 个文档(用户与所有者相同的图片)。 第一个函数返回一个空列表,这是错误的,因为它应该返回 6 个文档。 (所有已删除的图片)
第二个函数返回一个包含 6 个项目的列表,所以这个似乎工作正常。

我的查询有什么问题?

【问题讨论】:

  • 尝试:删除 System.LINQ 命名空间,然后删除 .AsEnumerable(),然后将一个子句中的 'Where' 与第二个查询中的 '&&' 运算符结合起来。你得到了什么?

标签: c# linq ravendb


【解决方案1】:

不支持更改对象的集合。 您需要删除并重新创建它(即使使用相同的 id)。

【讨论】:

    【解决方案2】:

    要查询元数据,您需要一个 Lucene 查询:

    session
        .Advanced.LuceneQuery<Picture>()
        .WhereEquals("@metadata.Raven-Entity-Name", "DeletedPictures");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多