3

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; }
}

ここでは、3 つの異なるタイプのクラスをオブジェクト 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; }
}

顧客のクラスの詳細に基づいて結果を取得することは可能ですか? これで、顧客クラスの住所に基づいてすべての顧客を取得したいのですが、どうすればよいでしょうか? クエリでオブジェクト user を typecast して customer と入力する方法。ありがとう。私のドキュメントストレージのイメージ

ドキュメント内のユーザー オブジェクトは、上の画像の account info trader のように、任意のタイプのクラスのオブジェクトを格納できます。では、明確で変化することができないオブジェクトタイプからどのようにクエリを実行できますか。

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

これは試行されたクエリであり、キャッチされた例外です {"Url: \"/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() で

4

2 に答える 2

1

ここでの問題は、raven db のビルドでした。クエリを新しいバージョンに変更した後、古いビルドを使用していました

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

正常に動作します。

于 2013-02-06T11:02:31.887 に答える
0

あなたのクラスはあまりDRYではありません。代わりにこれを考慮してください:

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含まれているクラスが呼び出され、コードを理解しなければならない人を混乱させる可能性があるため、プロパティをUser呼び出しUser.Userません。

于 2013-01-17T14:33:39.917 に答える