【问题标题】:Ouerying an object inside ravendb document在 ravendb 文档中添加对象
【发布时间】:2015-08-09 23:29:30
【问题描述】:

对于如何从存储在文档中的对象中查询或检索值存在疑问,如下在 raven db 中。

class User
{
       public String Id { get; set; }
       public AccountType AccountType { get; set; }Servicetax
       public String MainAccountMobileNo { get; set; }
       public UserStatus Status { get; set; }
       public String EmailId { get; set; }
       public String DisplayName { get; set; }
       public Object User { get; set; }
}

在这里,我将三种不同类型的类存储到对象 User 中。 说客户、零售商和贸易商。

Customer

{
           public String Name{ get; set; }
           public String Address { get; set; }
           public String MobileNo { get; set; }
           public String EmailId { get; set; }
}

零售商

{
           public String Name{ get; set; }
           public String Address { get; set; }
           public String MobileNo { get; set; }
           public String EmailId { get; set; }
}

交易者

{
           public String Name{ get; set; }
           public String Address { get; set; }
           public String MobileNo { get; set; }
           public String EmailId { get; set; }
}

现在可以根据客户的班级详细信息检索结果吗? 那就是现在我想根据客户类中的地址检索所有客户,那么我该怎么做呢?如何将查询中的对象用户类型转换为客户类型。 谢谢

文档中的用户对象可以存储任何类型的类对象,例如上图中的账户信息交易者。那么如何从不能确定和变化的对象类型中查询呢。

var Result = sess.Query<UserAccountInfo>().Where(x => x.AccountType == usertype && ((AccountInfoCustomer)x.User).Customerstatus == CustomerStatus.Pending);

这是已尝试的查询,这是已捕获的异常 {“网址: \"/indexes/dynamic/UserAccountInfos?query=AccountType%253ADistributor%2520AND%2520User).Customerstatus%253APending&start=0&pageSize=128&aggregation=None\"\r\n\r\nSystem.ArgumentException: 字段 ')_Customerstatus' 未编入索引,无法查询字段 未编入索引的\r\n 在 Raven.Database.Indexing.Index.IndexQueryOperation.AssertQueryDoesNotContainFieldsThatAreNotIndexes()

【问题讨论】:

  • 是的,这是可能的,但我没有看到您的用户类中引用了客户类。
  • 在您修复类以向我们展示您如何将它们关联起来之后,还请展示您尝试过的查询,以便我们了解您的意图。
  • 我将客户类存储在我在用户类中作为用户提到的对象类型中

标签: ravendb


【解决方案1】:

这里的问题是 raven db 的构建。在将查询更改为新版本后,我使用的是旧版本

var Result = sess.Query<UserAccountInfo>().Where(x => x.AccountType == usertype && ((AccountInfoCustomer)x.User).Customerstatus == CustomerStatus.Pending);

工作正常。

【讨论】:

    【解决方案2】:

    你的课不是很干。请考虑一下:

    public abstract class Person
    {
        public string Name{ get; set; }
        public string Address { get; set; }
        public string MobileNumber { get; set; }
        public string EmailAddress { get; set; }
    }
    
    public class Customer : Person {}
    public class Retailer : Person {}
    public class Trader : Person {}
    

    然后,在您的 User 类中替换

    public Object User { get; set; }
    

    有了这个:

    public Person Person { get; set; }
    

    这样,您可以存储 3 种派生类型中的任何一种的实例。我不会调用属性 User ,因为包含类称为 UserUser.User 可能会让任何必须理解您的代码的人感到困惑。

    【讨论】:

    • 感谢您的回复.. 但这不是我期望的解决方案,我将这些课程作为样本,它不是我真正的。如果您真的解决了我的问题,我将不胜感激。它正在查询存储在文档中的对象。
    • 如果您没有实际发布您遇到问题的代码,那么很难帮助您解决问题。您发布的代码无法引发您看到的错误。
    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多