分享

linq to entity 将多表查询返回的iqueryable对象系列化成json格式

 实力决定地位 2012-05-22

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Objects.DataClasses;
using System.Text;
using System.Reflection;
using System.Collections;

namespace Entity.Utity
{
    public static class EntityToJSON
    {
           #region 实体扩展方法
       
        /// <summary>
        /// 转换实体信息为Json
        /// </summary>
        /// <param name="obj">实体对象</param>
        /// <returns></returns>
        public static String ToEntitiesJson(this EntityObject obj)
        {
            return new EntitiesTools().EntitiesToJson(obj, "");
        }

        /// <summary>
        /// 转换实体信息为Json
        /// </summary>
        /// <param name="obj">实体对象</param>
        /// <param name="Include">获取子对象:使用,号分开</param>
        /// <returns></returns>
        public static String ToEntitiesJson(this EntityObject obj, String Include)
        {
            return new EntitiesTools().EntitiesToJson(obj, Include);
        }
        /// <summary>
        /// 转换实体信息为Json
        /// </summary>
        /// <param name="obj">实体对象</param>
        /// <returns></returns>
        public static String ToEntitiesJson(this IQueryable obj)
        {
            return new EntitiesTools().EntitiesToJson(obj, "");
        }

        /// <summary>
        /// 转换实体信息为Json
        /// </summary>
        /// <param name="obj">实体对象</param>
        /// <param name="Include">获取子对象:使用,号分开</param>
        /// <returns></returns>
        public static String ToEntitiesJson(this IQueryable obj, String Include)
        {
            return new EntitiesTools().EntitiesToJson(obj, Include);
        }

        /// <summary>
        /// 转换实体信息为Json
        /// </summary>
        /// <param name="obj">实体对象</param>
        /// <param name="Include">获取子对象:使用,号分开</param>
        /// <returns></returns>
        public static String ToEntitiesJson(this IList obj, String Include)
        {
            return new EntitiesTools().EntitiesToJson(obj, Include);
        }

        #endregion
    }


    #region 转换实体信息为Json

    /// <summary>
    /// 转换实体信息为Json
    /// </summary>
    public class EntitiesTools
    {
        #region 转换实体信息为Json
        /// <summary>
        /// 转换实体信息为Json
        /// </summary>
        /// <param name="obj">实体对象</param>
        /// <param name="Include">获取子对象:使用,号分开</param>
        /// <returns></returns>
        public String EntitiesToJson(Object obj, String Include)
        {
            Type type = obj.GetType();
            String sJosnString = "";
            StringBuilder TempStringJson = new StringBuilder();
            StringBuilder json = new StringBuilder();
            switch (type.Name)
            {
                case "ObjectQuery`1":
                    TempStringJson.Clear();
                    json.Append("[");
                    foreach (Object _obj in obj as IQueryable)
                    {
                        TempStringJson.Append(EntitiesToJson(_obj, Include, 0));
                        TempStringJson.Append(",");
                    }
                    sJosnString = TempStringJson.ToString();
                    json.Append(sJosnString.Substring(0, sJosnString.Length - 1));
                    json.Append("]");
                    break;
                case "List`1":
                    TempStringJson.Clear();
                    json.Append("[");
                    foreach (Object _obj in obj as IList)
                    {
                        TempStringJson.Append(EntitiesToJson(_obj, Include, 0));
                        TempStringJson.Append(",");
                    }
                    sJosnString = TempStringJson.ToString();
                    json.Append(sJosnString.Substring(0, sJosnString.Length - 1));
                    json.Append("]");
                    break;
                default:
                    json.Append(EntitiesToJson(obj, Include, 0));
                    break;
            }
            return json.ToString().Replace('/','\"');//将“/"转换成双引号

        }
        /// <summary>
        /// 转换实体信息为Json
        /// </summary>
        /// <param name="obj">实体对象</param>
        /// <param name="Include">获取子对象:使用,号分开</param>
        /// <param name="Level">当前递归的层级</param>
        /// <returns></returns>
        private String EntitiesToJson(Object obj, String Include, int Level)
        {
            if (obj == null) { return null; }
            StringBuilder TempStringJson = new StringBuilder();

            List<String> IncludeA = Include.Split(',').ToList<String>();

            //需要排除的属性类型
            List<String> ignoreEntityTypes = new List<String> { "EntityReference`1", "EntityState", "EntityKey", "EntitySetName" };
            //实体集合
            List<String> ListType = new List<String> { "EntityCollection`1" };
            //数据类型(非实体集合类型)
            List<String> EntitesType = new List<String> { "Binary", "Boolean", "DateTime", "DateTimeOffset", "Decimal", "Double", "Guid", "Int16", "Int32", "Int64", "Single", "String", "Time" };
            //未支持的数据类型
            List<String> NotType = new List<String> { "Byte", "SByte" };


            StringBuilder json = new StringBuilder();
            json.Append("{");
            Type type = obj.GetType();
            PropertyInfo[] propertyInfoList = type.GetProperties();

            string doubleQuote = "/";

            #region 迭代属性
            foreach (PropertyInfo _PropertyInfo in propertyInfoList)
            {
                #region 排除类型
                if (ignoreEntityTypes.Contains(_PropertyInfo.PropertyType.Name))
                {
                    continue;
                }
                #endregion

                var propertyName = _PropertyInfo.Name;
                var propertyType = _PropertyInfo.PropertyType;
                var propertyValue = _PropertyInfo.GetValue(obj, null);

                try
                {

                    #region 值=null
                    if (propertyValue == null)
                    {
                        json.Append(doubleQuote + propertyName + doubleQuote +
                                        ":" + "null");
                        json.Append(",");
                        continue;
                    }
                    #endregion

                    #region 非实体集合类型
                    if (EntitesType.Contains(propertyValue.GetType().Name))
                    {
                        try
                        {
                            TempStringJson.Clear();
                            TempStringJson.Append(doubleQuote + propertyName + doubleQuote +
                                        ":" + StringFormat(propertyValue, propertyType));
                            TempStringJson.Append(",");

                            json.Append(TempStringJson);
                            continue;
                        }
                        catch (Exception Err)
                        {
                            throw Err;
                        }

                    }
                    #endregion

                    #region 非Include对象
                    if (!IncludeA.Contains(propertyName))
                    {
                        json.Append(doubleQuote + propertyName + doubleQuote +
                                        ":" + "null");
                        json.Append(",");
                        continue;
                    }
                    #endregion

                    #region 实体集合类型
                    if (ListType.Contains(propertyValue.GetType().Name) && Level == 0)
                    {
                        try
                        {
                            TempStringJson.Clear();

                            bool IsNull = true;
                            //用来判断集合是否为空,待改善的方法
                            foreach (Object p in (IRelatedEnd)propertyValue)
                            {
                                IsNull = false;
                                break;
                            }

                            if (IsNull)
                            {
                                TempStringJson.Append(doubleQuote + propertyName + doubleQuote +
                                                ":" + "null");
                                TempStringJson.Append(",");
                                continue;
                            }

                            StringBuilder ListJosnString = new  StringBuilder();
                            json.Append(doubleQuote + propertyName + doubleQuote + ":[");
                            foreach (Object p in (IRelatedEnd)propertyValue)
                            {
                                String Child = EntitiesToJson(p, Include, 1);
                                ListJosnString.Append(Child);
                                ListJosnString.Append(",");
                            }
                            String sListJosnString = ListJosnString.ToString();
                            TempStringJson.Append(sListJosnString.Substring(0, sListJosnString.Length - 1));
                            TempStringJson.Append("]");
                            TempStringJson.Append(",");


                            json.Append(TempStringJson);
                            continue;
                        }
                        catch (Exception Err)
                        {
                            throw Err;
                        }
                    }
                    #endregion

                    #region 其他类型[应该只剩下实体对象了],有可能有没有考虑到的情况!
                    try
                    {
                        TempStringJson.Clear();
                        TempStringJson.Append(doubleQuote + propertyName + doubleQuote +
                                        ":" + EntitiesToJson(propertyValue, Include, 1));
                        TempStringJson.Append(",");


                        json.Append(TempStringJson);
                        continue;
                    }
                    catch (Exception Err)
                    {
                        throw Err;
                    }
                    #endregion
                }
                catch (Exception Err)
                {
                    json.Append(doubleQuote + propertyName + doubleQuote +
                                    ":" + "null");
                    json.Append(",");
                    continue;
                }

            }
            #endregion

            String sJosnString = json.ToString();
            return sJosnString.Substring(0, sJosnString.Length - 1) + "}";

        }
        /// <summary>
        /// 将datetime转换成js格式
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        private double UnixTicks(DateTime dt)
        {
            DateTime d1 = new DateTime(1970, 1, 1);
            DateTime d2 = dt.ToUniversalTime();
            TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
            return ts.TotalMilliseconds;
        }
        private string StringFormat(object val, Type type)
        {
            string str = val.ToString();
            if (type == typeof(string))
            {
               // str = String2Json(str);
                str = "/" + str + "/";
            }
            else if (type == typeof(DateTime) || Nullable.GetUnderlyingType(type) == typeof(DateTime))
            {
                //str = Convert.ToString(UnixTicks(Convert.ToDateTime(val)));
               //str="\\/Date("+str+")\\/";
                str = "/" + str + "/";
            }
            else if (type == typeof(bool))
            {
                str = str.ToLower();
            }
            return str;
        }
      

    }
}
        #endregion
    #endregion;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多