2

そのため、C#AWS SDKforDynamoを利用するモデルリポジトリがあります。今は少し醜いです。結果アイテムをモデルにキャストアウトしたいのですが。Dynamoに入るのは素晴らしいことです。私は自分のPocoクラスにいくつかのタイプのリフレクションを行い、次のようにそれらを押し込みます。

     var doc = new Document();
     foreach (PropertyInfo prop in model.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
     {
         var propName = (string)prop.Name;
         // dont add if value is null
         if (prop.GetValue(model, null) != null)
         {
             if (prop.PropertyType == typeof(string))
                 doc[propName] = (string)prop.GetValue(model, null);
             if (prop.PropertyType == typeof(List<string>))
                 doc[propName] = (List<string>)prop.GetValue(model, null);
             if (prop.PropertyType == typeof(float))
                 doc[propName] = (float)prop.GetValue(model, null);
         }
     }

しかし、ここのリポジトリでは、アイテムを取得するときにこの醜い手動キャストを書く必要はありません。これを手動でなくすためのAWSヘルパーはありますか?上記のループの逆を記述して属性プロパティ名を取得し、N、S、SSタイプなどごとにnullをテストできると思います。

var request = new ScanRequest
            {
                TableName = TableName.User,
            };

            var response = client.Scan(request);
            var collection = (from item in response.ScanResult.Items
                from att in item
                select new User(att.Value.S, att.Value.N, att.Value.S, att.Value.N, att.Value.S, att.Value.S, att.Value.S, att.Value.S, att.Value.S,
                    att.Value.S, att.Value.S, att.Value.S, att.Value.S, att.Value.SS, att.Value.SS)).ToList();

            return collection.AsQueryable();
4

5 に答える 5

5

.NETSDKのオブジェクト永続性モデル機能を使用できます。これにより、.NETオブジェクトに属性で注釈を付けて、そのデータをDynamoDBに保存する方法をSDKに指示できます。

于 2013-02-19T02:00:44.097 に答える
5

組み込みのFromDocumentメソッドを使用しDictionary<string, AttributeValue>て、をタイプTのクラスに変換できます。

List<MyClass> result = new List<MyClass>();

var response = await client.QueryAsync(request);

        foreach (Dictionary<string, AttributeValue> item in response.Items)
        {
            var doc = Document.FromAttributeMap(item);
            var typedDoc = context.FromDocument<MyClass>(doc);
            result.Add(typedDoc);
        }
于 2019-11-08T12:57:31.933 に答える
0

私はそれをLOOOOOONGの方法でやることになりました。タイプリフレクションを使って自分のキャスト関数を作成するのはちょっと楽しかったです。午前2時でなければもっと楽しかったでしょう。

Pavelの答えはより公式ですが、これはまだ魅力のように機能します。

public static T ResultItemToClass<T>(Dictionary<string, AttributeValue> resultItem) where T : new()
        {
            var resultDictionary = new Dictionary<string, object>();

            Type type = typeof(T);
            T ret = new T();

            foreach (KeyValuePair<string, AttributeValue> p in resultItem)
                if (p.Value != null)
                    foreach (PropertyInfo prop in p.Value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
                        if (prop.GetValue(p.Value, null) != null)              
                            {
                                if (prop.Name == "S")
                                    type.GetProperty(p.Key).SetValue(ret, prop.GetValue(p.Value, null), null);                                    

                                if (prop.Name == "SS")
                                    type.GetProperty(p.Key).SetValue(ret, (List<string>)prop.GetValue(p.Value, null), null);

                                if (prop.Name == "N")
                                    type.GetProperty(p.Key).SetValue(ret,  Convert.ToInt32(prop.GetValue(p.Value, null)), null);

                                // TODO: add some other types. Too tired tonight
                            }                           
            return ret;
        }
于 2013-02-21T05:22:21.713 に答える
0

aws Documentの結果クラスから、インスタンスメソッド.ToJson()を使用して、クラスにデシリアライズできます。

于 2017-06-09T05:10:36.373 に答える
0

ジェネリックメソッドは、拡張関数としてDynamoテーブルをc#クラスに変換します。

public static List<T> ToMap<T>(this List<Document> item)
    {
        List<T> model = (List<T>)Activator.CreateInstance(typeof(List<T>));
        foreach (Document doc in item)
        {
            T m = (T)Activator.CreateInstance(typeof(T));
            var propTypes = m.GetType();
            foreach (var attribute in doc.GetAttributeNames())
            {
                var property = doc[attribute];
                if (property is Primitive)
                {
                    var properties = propTypes.GetProperty(attribute);
                    if (properties != null)
                    {
                        var value = (Primitive)property;
                        if (value.Type == DynamoDBEntryType.String)
                        {
                            properties.SetValue(m, Convert.ToString(value.AsPrimitive().Value));
                        }
                        else if (value.Type == DynamoDBEntryType.Numeric)
                        {
                            properties.SetValue(m, Convert.ToInt32(value.AsPrimitive().Value));
                        }
                    }
                }
                else if (property is DynamoDBBool)
                {
                    var booleanProperty = propTypes.GetProperty(attribute);
                    if (booleanProperty != null)
                        booleanProperty.SetValue(m, property.AsBoolean());
                }
            }
            model.Add(m);
        }
        return model;
    } 
于 2020-11-07T17:23:46.917 に答える