在ravendb文档中修改一个对象

时间:2013-01-09 13:12:12

标签: ravendb

如何在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; }
}

现在可以根据客户的班级详细信息检索结果吗? 现在我想根据客户类中的地址检索所有客户,那我该怎么做呢?如何在查询中对对象用户进行类型转换以键入customer。 感谢。Image of my document storage

文档中的用户对象可以在上图中存储任何类型的对象,如帐户信息交易者。那么我如何从不能确定和改变的对象类型进行查询。

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

  

这是已经尝试过的查询,这是被捕获的异常    {“URL:   \ “/索引/动态/ UserAccountInfos查询= ACCOUNTTYPE%253ADistributor%2520AND%2520User).Customerstatus%253APending&安培;开始= 0&安培;的pageSize = 128&安培;聚集=无\?” \ r \ n \ r \ nSystem.ArgumentException:   字段')_Customerstatus'未编入索引,无法查询字段   未编入索引的\ r \ n at   Raven.Database.Indexing.Index.IndexQueryOperation.AssertQueryDoesNotContainFieldsThatAreNotIndexes()

2 个答案:

答案 0 :(得分:1)

这里的问题是乌鸦数据库的构建。我将旧版本更改为更新版本的查询后使用旧版本

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

工作正常。

答案 1 :(得分:0)

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

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可能会让任何必须理解您的代码的人感到困惑。