RavenDB使用没有Id属性的对象进行查询

时间:2014-05-21 21:53:14

标签: c# linq ravendb

我使用类在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的新手,请原谅我,如果这是一个显而易见的问题。

谢谢, 布赖恩

2 个答案:

答案 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>()