【问题标题】:RavenDB querying with object that doesn't have Id propertyRavenDB 使用没有 Id 属性的对象进行查询
【发布时间】:2014-05-21 21:53:13
【问题描述】:

我正在使用一个类在 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; }
}

然后我们希望能够运行类似于下面的代码来查询 "Customer" 文档但返回包含 Id 的 "CustomerRecord" 格式:

using (var session = _docStore.OpenSession())
{
   var customer = session.Query<Customer>()
            .ToList<CustomerRecord>();
}

上面的代码不起作用,因为 linq 查询需要 Query 类型和 ToList 类型相同。任何人都可以帮助解决返回基类的问题吗?

我对 RavenDB 很陌生,所以如果这是一个明显的问题,请原谅我。

谢谢, 布赖恩

【问题讨论】:

    标签: c# linq ravendb


    【解决方案1】:

    不确定您的具体问题是什么,为什么不直接选择这样的 ID:

    session.Query<Customer>().Select(c=> c.Id).ToList()
    

    或许

    session.Query<Customer>().ToList().Cast<CustomerRecord>()
    

    或者您正在寻找的是多地图索引: http://ravendb.net/docs/client-api/querying/polymorphism

    【讨论】:

    • 我需要返回整个记录,所以也许您使用 Cast() 的第二个示例就是我需要的。我会试一试。谢谢!
    • 请记住,RavenDB 将仅返回前 128 个文档,请参阅 ravendb.net/docs/intro/safe-by-default
    【解决方案2】:

    您说您“无法更改类的结构以包含Id 属性”,但您可以显然修改基类......这会改变类的结构。这两条信息放在一起似乎没有意义。你能澄清一下吗?

    也就是说,在 RavenDB 中使用不受控制的类作为模型类并不是一个好主意。如果他们在你背后改变,这只会导致心痛。在无模式文档数据库中,这些类是您的模式。您不会将 SQL 架构的控制权交给第三方!

    关于从另一个答案中使用.Cast&lt;T&gt;() 的建议,这发生在客户端并且不是最好的,因为这发生在所有客户端。 RavenDB 包含两种进行服务器端投影的方法,.OfType&lt;T&gt;()ProjectFromIndexFieldsInto&lt;T&gt;,它们的工作方式略有不同。

    .OfType&lt;T&gt;() 允许您更改为完全不同的类型,它恰好具有一些相同的属性。一个好处是服务器只会发送您需要水合该类型的属性,例如,填充不需要继承或与模型类相关的视图模型类。

    .ProjectFromIndexFieldsInto&lt;T&gt;() 做同样的事情,但直接从 Lucene 中存储的值(RavenDB 索引背后的支持存储和搜索功能)中获取这些值,而不考虑模型文档本身的内容。

    查看链接的文档页面了解更多详情,尽管我认为在您的情况下,您可能会寻找.OfType&lt;T&gt;()

    【讨论】:

    • 大卫,您的初始观点是有效的,但是如果不泄露我无法分享的信息,我无法真正解释原因。我知道数据结构是内部控制的,不会像第三方那样发生变化。感谢您对 OfType 和 ProjectFromIndexFieldInto 的建议。我很快就会尝试这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多