zoukankan      html  css  js  c++  java
  • PetaPoco支持Dynamic(ExpandoObject)类型参数 拓荒者

    修改ParametersHelper类,添加ExpandoObject的类型判断吧,修改后的代码如下:

    // PetaPoco - A Tiny ORMish thing for your POCO's.
    // Copyright © 2011-2012 Topten Software.  All Rights Reserved.
     
    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    using System.Text;
    
    namespace PetaPoco.Internal
    {
        internal static class ParametersHelper
        {
            // Helper to handle named parameters from object properties
            public static string ProcessParams(string sql, object[] args_src, List<object> args_dest)
            {
                return rxParams.Replace(sql, m =>
                {
                    string param = m.Value.Substring(1);
    
                    object arg_val;
    
                    int paramIndex;
                    if (int.TryParse(param, out paramIndex))
                    {
                        // Numbered parameter
                        if (paramIndex < 0 || paramIndex >= args_src.Length)
                            throw new ArgumentOutOfRangeException(string.Format("Parameter '@{0}' specified but only {1} parameters supplied (in `{2}`)", paramIndex, args_src.Length, sql));
                        arg_val = args_src[paramIndex];
                    }
                    else
                    {
                        // Look for a property on one of the arguments with this name
                        bool found = false;
                        arg_val = null;
                
                        foreach (var o in args_src)
                        {
                            //使其支持ExpandoObject
                            if (o.GetType() == typeof(System.Dynamic.ExpandoObject))
                            {
                                var dic = o as IDictionary<string, object>;
                                if (dic.ContainsKey(param))
                                {
                                    arg_val = dic[param];
                                    found = true;
                                    break;
                                }
                            }
                            else
                            {
                                var pi = o.GetType().GetProperty(param);
                                if (pi != null)
                                {
                                    arg_val = pi.GetValue(o, null);
                                    found = true;
                                    break;
                                }
                            }
                        }
    
                        if (!found)
                            throw new ArgumentException(string.Format("Parameter '@{0}' specified but none of the passed arguments have a property with this name (in '{1}')", param, sql));
                    }
    
                    // Expand collections to parameter lists
                    if ((arg_val as System.Collections.IEnumerable) != null &&
                        (arg_val as string) == null &&
                        (arg_val as byte[]) == null)
                    {
                        var sb = new StringBuilder();
                        foreach (var i in arg_val as System.Collections.IEnumerable)
                        {
                            sb.Append((sb.Length == 0 ? "@" : ",@") + args_dest.Count.ToString());
                            args_dest.Add(i);
                        }
                        return sb.ToString();
                    }
                    else
                    {
                        args_dest.Add(arg_val);
                        return "@" + (args_dest.Count - 1).ToString();
                    }
                }
                );
            }
    
            static Regex rxParams = new Regex(@"(?<!@)@\w+", RegexOptions.Compiled);
        }
    }

    标红的部分就是修改过的代码

  • 相关阅读:
    从零开始学Flask框架-002
    从零开始学Flask框架-001
    js 数组去重 + 数组内元素为对象去重
    使用npx 搭建项目-继续爬坑
    使用nuxt.js+koa2创建项目-继续爬坑
    nuxt.js 初次运行报错 -- 爬坑全过程
    VueRouter配置引入
    MySqlHelper.ExecuteReader 爬坑
    javascript 解析,设置,检测cookie
    python sqlite数据库操作小坑
  • 原文地址:https://www.cnblogs.com/youring2/p/3066360.html
Copyright © 2011-2022 走看看