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. C#类的实例

    一.C#类的实例 类的实例其实就是类的对象.定义类之后即可声明类的对象,声明对象之后便可以访问对象的成员了. 语法格式如下: 类名 对象名;         // 声明对象对象名 = new 类名() ...

  2. python中的反斜杠问题

    python本身使用 \ 来转义一些特殊字符,比如在字符串中加入引号的时候 s = 'i\'m superman' print(s) # i'm superman 为了防止和字符串本身的引号冲突,使用 ...

  3. lintcode_111_爬楼梯

    爬楼梯   描述 笔记 数据 评测 假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的 ...

  4. Hibernate进阶学习3

    Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...

  5. ethereum(以太坊)(六)--整型(int)

    pragma solidity ^0.4.20; /* uint8 uint16 ...uint256 int8 int16 int24 ..int256 uint => uint256 int ...

  6. PHP小练习题

    前几天在百度知道里面看到有位网友询问如何制作一下的小程序:用php语言设计一个小程序,计算今天到达下月的天数.全部输出这些天数,并使得每天的日期以三种颜色循环显示,设置三个表单,让用户选择字体颜色,然 ...

  7. 40.VUE学习之--组件之间的数据传参父组件向子组件里传参,props的使用实例操作

    父组件向子组件里传参,props的使用实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  8. POJ 3171 区间最小花费覆盖 (DP+线段树

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4245   Accepted: 1429 D ...

  9. redis学习1(nosql)

    一. 互联网时代背景下大机遇,为什么用nosql 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付.在那个时候,更多的都是静态网页,动态交互类型的网站 ...

  10. Linux YUM (Yellowdog Updater, Modified) Commands for Package Management

    Linux YUM (Yellowdog Updater, Modified) Commands for Package Management In this article, we will lea ...