var ui = (from u in _db.USER_INFO select u).FirstOrDefault();

// 单个实体的用法

ZRQCommon.EntitiesTools e = new ZRQCommon.EntitiesTools();

return e.EntitiesToJson(ui, ",");

// 实体列表用法

return ZRQCommon.EntityObjectExtensionMethods.ToEntitiesJson(uinfo, ",");

// 下面是代码

namespace ZRQCommon
{
public static class EntityObjectExtensionMethods
{
#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("True", "'True'").Replace("False", "'False'");

}
/// <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) + "}";

}

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 = DateTimeUtils.DateNetToJs((DateTime)val);
str = "'" + str + "'";
}
else if (type == typeof(bool))
{
str = str.ToLower();
}
return str;
}

/// <summary>
/// 过滤特殊字符
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private static string String2Json(String s)
{
return s;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.Length; i++)
{
char c = s.ToArray()[i];
switch (c)
{
case '/':
sb.Append("'"); break;
//case '//':
// sb.Append("////"); break;
//case '/':
// sb.Append("///"); break;
//case '/b':
// sb.Append("//b"); break;
//case '/f':
// sb.Append("//f"); break;
//case '/n':
// sb.Append("//n"); break;
//case '/r':
// sb.Append("//r"); break;
//case '/t':
// sb.Append("//t"); break;
default:
sb.Append(c); break;
}
}
return sb.ToString();
}

#endregion

#endregion
}
}

使用 Entity Framework 返回 JsonResult 时循环引用的避免【EF 转 JSON】的更多相关文章

  1. spring jpa 实体互相引用返回restful数据循环引用报错的问题

    spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLa ...

  2. Entity Framework使用Sqlite时的一些配置

    前段时间试着用Entity Framework for Sqlite环境,发现了一些坑坑洼洼,记录一下. 同时试了一下配置多种数据库,包括Sqlite.Sql Server.Sql Server Lo ...

  3. 一个C#序列化时循环引用的问题

    以前一直没搞懂为什么C#在做对象序列化时(Json序列化,XML序列化等)有时候会出现循环引用的问题,下面写了个例子,类People有一个属性引用了类Child,而类Child也有一个属性引用了类Pe ...

  4. Entity Framework添加记录时获取自增ID值

    与Entity Framework相伴的日子痛并快乐着.今天和大家分享一下一个快乐,两个痛苦. 先说快乐的吧.Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增 ...

  5. [转] Entity Framework添加记录时获取自增ID值

    本文转自:http://blog.csdn.net/educast/article/details/8632806 与Entity Framework相伴的日子痛并快乐着.今天和大家分享一下一个快乐, ...

  6. Entity Framework: 视图查询时重复返回第一行值, duplicate frst rows in resultset from a view

    http://blog.csdn.net/riverlau/article/details/7476449 1. 使用rownumber给view加上一个标示列 SELECT ROW_NUMBER() ...

  7. Entity Framework返回IEnumerable还是IQueryable?

    在使用EF的过程中,我们常常使用repository模式,本文就在repository层的返回值是IEnumerable类型还是IQueryable进行探讨. 阅读目录: 一.什么是Repositor ...

  8. Entity Framework中编辑时错误ObjectStateManager 中已存在具有同一键的对象

    ObjectStateManager 中已存在具有同一键的对象.ObjectStateManager 无法跟踪具有相同键的多个对象. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈 ...

  9. Entity Framework连接MySQL时:由于出现以下异常,无法生成模型:“表“TableDetails”中列“IsPrimaryKey”的值为DBNull.

    解决办法一: 1.cmd 2.c:\Users\Administrator>cd c:\Program Files\MySQL\MySQL Server 5.7\bin 3c:\Program ...

随机推荐

  1. 顺序语句:GOTO和NULL语句

    一 标号和GOTO 1 语法: PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思.语法如下: GOTO label;......<<label>> /*标号是用< ...

  2. v-for的简单实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Hbase学习指南

    本篇Hbase组件基于CDH5进行安装,安装过程:https://www.cnblogs.com/dmjx/p/10037066.html Hbase简介 HBase是一个高可靠.高性能.面向列.可伸 ...

  4. JAVAOOP集合框架

    集合框架三大内容:对外的接口.接口的实现和对集合运算的算法 集合有三大类接口:List.Set.Map 共同点:都是集合接口,都可以用来存储很多对象 不同:Collection接口存储一组不唯一(允许 ...

  5. html页面 加载完成后再刷新 一次

    主要用于第一次加载页面有部分加载bug,再刷新一次即可正常运行. 简单粗暴直接上代码,不带参数,0影响 <Script>function refresh(){ url = location ...

  6. vue 点击当前元素添加class 去掉兄弟的class

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. 【转载】Callable、FutureTask中阻塞超时返回的坑点

    本文转载自:http://www.cnblogs.com/starcrm/p/5010863.html 案例1: package com.net.thread.future; import java. ...

  8. Linux两种方式rd.break和init重置root管理员密码

    centos7/rhel7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ctrl+x引导. 重置密码主要有rd.break和init两种方法. rd.break方法: 1.启动的时 ...

  9. Samba和NFS文件共享

    SAMBA文件共享服务 通过Yum软件仓库来安装Samba服务程序 [root@zhangjh ~]# yum install samba -y Samba 配置文件注释信息较多,为了便于配置,因此先 ...

  10. get请求中url传参中文乱码问题

    在项目中经常会遇到中文传参数,在后台接收到乱码问题.那么在遇到这种情况下我们应该怎么进行处理让我们传到后台接收到的参数不是乱码是我们想要接收的到的,下面就是我的一些认识和理解. 一:get请求url中 ...