2

所以我有一个模型存储库,它利用 C# AWS SDK for Dynamo。现在有点难看。我想要的是将结果项丢弃到我的模型中。进入 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);
         }
     }

但是在 repo 中,我不想在检索项目时编写这个丑陋的手动转换。是否有 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

您可以使用.NET SDK 的对象持久性模型功能。这允许您使用属性注释您的 .NET 对象,然后指导 SDK 如何将数据存储在 DynamoDB 中。

于 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 点会更有趣。

帕维尔的回答更正式,但这仍然像一个魅力。

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

泛型方法将 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 回答
0

从 aws Document 结果类中,您可以使用实例方法:.ToJson(),然后反序列化到您的类中。

于 2017-06-09T05:10:36.373 回答