使用 Entity Framework 返回 JsonResult 时循环引用的避免【EF 转 JSON】
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】的更多相关文章
- spring jpa 实体互相引用返回restful数据循环引用报错的问题
spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLa ...
- Entity Framework使用Sqlite时的一些配置
前段时间试着用Entity Framework for Sqlite环境,发现了一些坑坑洼洼,记录一下. 同时试了一下配置多种数据库,包括Sqlite.Sql Server.Sql Server Lo ...
- 一个C#序列化时循环引用的问题
以前一直没搞懂为什么C#在做对象序列化时(Json序列化,XML序列化等)有时候会出现循环引用的问题,下面写了个例子,类People有一个属性引用了类Child,而类Child也有一个属性引用了类Pe ...
- Entity Framework添加记录时获取自增ID值
与Entity Framework相伴的日子痛并快乐着.今天和大家分享一下一个快乐,两个痛苦. 先说快乐的吧.Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增 ...
- [转] Entity Framework添加记录时获取自增ID值
本文转自:http://blog.csdn.net/educast/article/details/8632806 与Entity Framework相伴的日子痛并快乐着.今天和大家分享一下一个快乐, ...
- Entity Framework: 视图查询时重复返回第一行值, duplicate frst rows in resultset from a view
http://blog.csdn.net/riverlau/article/details/7476449 1. 使用rownumber给view加上一个标示列 SELECT ROW_NUMBER() ...
- Entity Framework返回IEnumerable还是IQueryable?
在使用EF的过程中,我们常常使用repository模式,本文就在repository层的返回值是IEnumerable类型还是IQueryable进行探讨. 阅读目录: 一.什么是Repositor ...
- Entity Framework中编辑时错误ObjectStateManager 中已存在具有同一键的对象
ObjectStateManager 中已存在具有同一键的对象.ObjectStateManager 无法跟踪具有相同键的多个对象. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈 ...
- Entity Framework连接MySQL时:由于出现以下异常,无法生成模型:“表“TableDetails”中列“IsPrimaryKey”的值为DBNull.
解决办法一: 1.cmd 2.c:\Users\Administrator>cd c:\Program Files\MySQL\MySQL Server 5.7\bin 3c:\Program ...
随机推荐
- js动画之无缝滚动
效果图如下: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- 网页更换主题以及绘制图形js代码实现
HTML代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Dnsmasq域名解析系统安装配置
Dnsmasq使用上比bind要简便得多,可以做正向.反向dns解析,支持DHCP服务.也可以做内部dns服务器用. 默认下,dnsmasq使用系统的/etc/resolv.conf,并读取/etc/ ...
- httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例
httpd配置内容 httpd2.2 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/ ...
- python join() 提示UnicodeDecodeError: 'utf8' codec can't decode byte 0xcb in position 0: unexpected end of的原因及解决办法
问题: 在使用join()将列表元素连接成字符串时出错如下 return split.join(result) UnicodeDecodeError: 'utf8' codec can't decod ...
- rsync同步备份搭建
Rsync 是 Unix/Linux 下的一款应用软 在平常的运维中进常要对一些数据进行备份,以防止意外的服务器故障导致不可避免的后果,tar,cp只能适应一些小范围backup,对于几T甚至几P的数 ...
- MySQL基础 (麦子学员 php 第二阶段)
通过my.ini配置文件修改字符集:客户端字符集设置:[mysql]default-character-set=utf8 [mysqld] character-set-server=utf8 .设置之 ...
- 提高mysql性能(like搜索替换 )
一 .mysql用find_in_set代替like搜索提高性能 SELECT * from mobantestinfo1 where find_in_set('33',info2); 二 .使用内部 ...
- PLC状态机编程第二篇-负载均衡
控制任务 大家好,今天我们用状态机描述稍复杂的实例,同时用LAD和ST语言写状态机.我们的控制任务如下: 真空泵A和真空泵B, 按下启动按钮后, 泵A启动, 3秒后泵B也启动, 此时泵A仍运行, 当容 ...
- C语言实例解析精粹学习笔记——28
实例28:从键盘读入实数 题目要求: 编制一个从键盘读入实数的函数readreal(double *rp).函数将读入的实数字符列转换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp. 思 ...