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