C# 查询具有反射类型的RavenDB

C# 查询具有反射类型的RavenDB,c#,ravendb,C#,Ravendb,我通过反射动态加载类型,实例化类,用数据填充它们,然后将它们保存到RavenDB。它们都实现了一个接口IEntity 在RavendbUI中,我可以看到类正确显示,元数据具有正确的CLR类型 现在我想把数据拿回来,修改它,然后保存它 我想做什么 我有一个与RavenDB的CLR元数据中的实体相匹配的System.Type,假设它被称为myType,我想这样做: session.Query(myType).ToList(); // session is IDocumentSession 但您不能

我通过反射动态加载类型,实例化类,用数据填充它们,然后将它们保存到RavenDB。它们都实现了一个接口
IEntity

在RavendbUI中,我可以看到类正确显示,元数据具有正确的CLR类型

现在我想把数据拿回来,修改它,然后保存它

我想做什么 我有一个与RavenDB的CLR元数据中的实体相匹配的
System.Type
,假设它被称为
myType
,我想这样做:

session.Query(myType).ToList(); // session is IDocumentSession
但您不能这样做,因为RavenDB查询是这样的:

session.Query<T>();
在数据库中,这将生成一个名为
myDataObject.GetType().name
的文档。如果您这样做:

var myDataObject = session.Load<IEntity>(Id);
var myDataObject=session.Load(Id);
然后它将找不到文档,因为它不是以名称
IEntity
保存的,而是以动态类型的名称保存的

现在Lucene解决方案也不起作用,但原因稍微复杂一些。当Lucene找到类型(它确实找到了)时,Raven将其传递给。自定义Json反序列化程序无法访问元数据,因此它不知道要反映哪种类型

当您知道类型但不在编译时检索数据时,是否有更好的方法?

谢谢。

如果您有身份证:

var myDataObject=session.Load(Id);
//更改myDataObject。根据需要使用myDataObject.GetType()
//....
session.SaveChange();
对于查询,LuceneQuery是合适的

var tag = documentStore.Conventions.GetTypeTagName(typeof(YourDataType));
var myDataObjects = session.Advanced
                 .LuceneQuery<IEntity, RavenDocumentsByEntityName>()
                 .WhereEquals("Tag", tag)
                 .AndAlso()
                  //....
var tag=documentStore.Conventions.GetTypeTagName(typeof(YourDataType));
var myDataObjects=session.Advanced
.LuceneQuery()
.WhereEquals(“Tag”,Tag)
.AndAlso()
//....

谢谢你的回答,董先生。不幸的是,这两种解决方案都不起作用。我更新了我的帖子,因为原因比评论更复杂。
session.Store(myDataObject);
var myDataObject = session.Load<IEntity>(Id);
var myDataObject = session.Load<IEntity>(Id);
//change myDataObject. Use myDataObject.GetType() as you want 
//....
session.SaveChange();
var tag = documentStore.Conventions.GetTypeTagName(typeof(YourDataType));
var myDataObjects = session.Advanced
                 .LuceneQuery<IEntity, RavenDocumentsByEntityName>()
                 .WhereEquals("Tag", tag)
                 .AndAlso()
                  //....