Linq查询从特定的RavenDB集合中获取数据不能按预期工作

时间:2015-07-22 12:42:14

标签: c# linq ravendb

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

在应用程序中,用户可以删除自己的图片。删除的Picture对象将被放入第二个集合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(&#34; Raven-Entity-Name&#34;)

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

我的查询有什么问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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