所以我使用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个项目的列表,因此这个项目似乎工作正常。
我的查询有什么问题?
答案 0 :(得分:1)
不支持更改对象的集合。 您需要删除并重新创建它(即使使用相同的ID)。
答案 1 :(得分:0)
要查询元数据,您需要Lucene查询:
session
.Advanced.LuceneQuery<Picture>()
.WhereEquals("@metadata.Raven-Entity-Name", "DeletedPictures");