我使用类在RavenDb中存储数据,但我无法更改类的结构以包含“Id”属性。我想稍后使用Id属性来检索文档。我怎么能这样做?
我尝试过使用基类,如下所示:
class Customer : CustomerRecord
{
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
其中CustomerRecord将包含“Id”属性,如下所示:
class CustomerRecord
{
public int Id { get; set; }
}
然后我们希望能够运行类似下面的代码来查询“客户”文档但返回“CustomerRecord”格式,包括ID:
using (var session = _docStore.OpenSession())
{
var customer = session.Query<Customer>()
.ToList<CustomerRecord>();
}
上面的代码不起作用,因为linq查询需要具有Query类型和ToList类型相同。任何人都可以帮助解决返回基类的问题吗?
我是RavenDB的新手,请原谅我,如果这是一个显而易见的问题。
谢谢, 布赖恩
答案 0 :(得分:0)
不确定您的具体问题是什么,为什么不选择这样的ID:
session.Query<Customer>().Select(c=> c.Id).ToList()
或者
session.Query<Customer>().ToList().Cast<CustomerRecord>()
或许您正在寻找的是多地图索引: http://ravendb.net/docs/client-api/querying/polymorphism
答案 1 :(得分:0)
你说你“不能改变类的结构以包含Id
属性”,但你可以显然修改了基类......这改变了类的结构。这两条信息似乎没有任何意义。你能澄清一下吗?
也就是说,在RavenDB中使用你不能控制的类作为模型类并不是一个好主意。如果他们在背后改变,这只会导致心痛。在无模式文档数据库中,这些类是您的模式。您不仅可以将对SQL架构的控制权交给第三方!
关于从另一个答案使用.Cast<T>()
的建议,这发生在客户端并且不是最好的,因为这发生在所有客户端。 RavenDB包含两种执行服务器端投影的方法.OfType<T>()
和ProjectFromIndexFieldsInto<T>
,它们的工作方式略有不同。
.OfType<T>()
允许您更改为恰好具有某些相同属性的完全不同的类型。一个好处是服务器只会向下发送您需要的属性来保存该类型,例如,填充不需要继承或与模型类相关的视图模型类。
.ProjectFromIndexFieldsInto<T>()
执行相同的操作,但直接从Lucene中的存储值(RavenDB索引后面的后备存储和搜索功能)中获取这些值,而不考虑模型文档本身中的内容。
查看链接的文档页面以获取更多详细信息,尽管在您的情况下我想您可能正在寻找.OfType<T>()
。