http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 7930|回复: 0

[C#语言基础] WCF结合linq to EF以及将数据序列化成json

[复制链接]
发表于 2013-1-19 10:41:26 | 显示全部楼层 |阅读模式
本帖最后由 Koson 于 2013-1-19 10:49 编辑

又是一周一次的周六了,小版主今天给大家分享一下WCF作为服务端返回数据的经验吧。由于时间有限,这篇帖子不会讲得很详细,只会涉及到相关的介绍和说明。加之刚刚在论坛看到有人发帖文如何解析json,所以就把这篇帖子分享一下哦。

1、WCF是什么?概念就不多说了,小版主之所以用WCF作为服务端,是因为它的确是非常强大的。至少现在于小版主而言,是如此的。(小版主的项目中,因为不仅仅涉及到Website,还涉及到CMS,同时也还涉及到移动平台(iPhone和Android),可想而知,这些平台都需要用到同一个数据库的数据,WCF在项目中就至关重要了,适应所有平台的需要。)。

2、EF是什么?是MS在 ado.net基础所发展出来的对象关系映射 (ORM)的一个强大实用的框架,哈哈,不管你是否是这样觉得,反正小版主是深有所感的。现在已经发展到了4.X的版本。至于能帮我们做什么,等会看看代码吧。

3、LINQ就不用多说了吧。相信大家也肯定接触过了。学习linq就先了解学习一下拉姆达表达式吧。那样子或许会更好理解,尽管说你写sql语句已经比较熟悉。

4、JSON,之所以成为最理想的数据交换语言。因为其轻巧便利,容易被解析、生成以及传递。其结构是名/值对得形式呈现,如:{'Name':'Koson','Age':'21'},想知道小版主得更多私人信息嘛?哈哈,那就看复杂一些得JSON呈现吧:{'Name':'Koson','Age':'21','MoreInfo':[{'Sex':'Man'},{'ChineseName':'Guo'},{'Developer Language':'C# OBJECTIVE-C'}]}

5、介绍了那么多了,但是因为涉及到得东西还是比较多,就不多讲了,直接看代码吧。

1)新建一个WCF的Project,而且小版主在发帖子得时候是在苹果得狮子系统上,也没有这个开发环境,就不能够截图演示了。
2)新建EDMX,可以使用向导使用你已经建好了的数据库,会自动生成你需要的,也可以使用CODE FIRST方式,新建你的数据库。
3)在此基础上,找到你的接口文件,打开。新增一个执行新增操作的方法吧。代码如下:
  1.     /// <summary>
  2.     /// 功能简述:WCF Service
  3.     /// 撰写人员:Konson
  4.     /// 撰写日期:2012/09/15
  5.     /// 修改人员:
  6.     /// 修改日期:
  7.     /// </summary>
  8.     [ServiceContract]
  9.     public interface IHKService
  10.     {

  11.         //功能简述:新增街道资讯资料
  12.         //撰写人员:Konson
  13.         //撰写日期:2012/10/19
  14.         //修改人员:
  15.         //修改日期:
  16.         [WebInvoke(Method = "POST")]
  17.         bool AddStreetInfo(StreetInfo streetinfo);
  18. }
复制代码
4)找到实现文件,对应写上刚刚定义的方法,代码如下:
  1.     /// <summary>
  2.     /// 功能简述:WCF Service
  3.     /// 撰写人员:Konson
  4.     /// 撰写日期:2012/09/15
  5.     /// 修改人员:
  6.     /// 修改日期:
  7.     /// </summary>
  8.     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  9.     [JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")]
  10.     public class LifeInHKService : ILifeInHKService
  11.     {
  12.         LifeInHKEntities entity = new LifeInHKEntities();
  13.      
  14.         /// <summary>
  15.         /// 功能简述:新增街道资讯资料
  16.         /// 撰写人员:Konson
  17.         /// 撰写日期:2012/09/19
  18.         /// 修改人员:
  19.         /// 修改日期:  
  20.         /// </summary>
  21.         public bool AddStreetInfo(StreetInfo streetinfo)
  22.         {
  23.             bool boolSuccess = true;
  24.             entity.Connection.Open();
  25.             var var_transaction = entity.Connection.BeginTransaction(IsolationLevel.Serializable);
  26.             try
  27.             {
  28.                 StreetInfo Streetinfo = new StreetInfo();
  29.                 Streetinfo.name = streetinfo.name;
  30.                 Streetinfo.description = streetinfo.description;
  31.                 Streetinfo.imageUrl = streetinfo.imageUrl;
  32.                 Streetinfo.lastupdatetime = streetinfo.lastupdatetime;
  33.                 entity.StreetInfo.AddObject(Streetinfo);
  34.                 entity.SaveChanges();
  35.                 var_transaction.Commit();
  36.             }
  37.             catch {
  38.                 boolSuccess = false;
  39.                 var_transaction.Rollback();
  40.             }
  41.             finally {
  42.                 var_transaction.Dispose();
  43.                 entity.Connection.Close();
  44.             }
  45.             return boolSuccess;
  46.         }
复制代码
其中AddStreetInfo(StreetInfo streetinfo)方法主要是实现新增一条数据,此方法参数使用的是一个实体对象StreetInfo,而且方法中也有使用事务。entity.StreetInfo.AddObject(Streetinfo);AddObject()方法就是新增的方法,最后还需要提交 entity.SaveChanges();才真正的执行了保存操作呢。

5)修改和删除操作其实也就差不多很简单了,直接看代码吧,接口文件里写上:
  1. /// <summary>
  2.         /// 功能简述:更新街道资讯资料
  3.         ///  撰写人员:Konson
  4.         /// 撰写日期:2012/09/19
  5.         /// 修改人员:
  6.         /// 修改日期:
  7.         /// </summary>
  8.         bool UpdateStreetInfo(StreetInfo streetinfo);

  9.         /// <summary>
  10.         /// 功能简述:刪除街道资讯资料
  11.         /// 撰写人员:Konson
  12.         /// 撰写日期:2012/09/19
  13.         /// 修改人员:
  14.         /// 修改日期:
  15.         /// </summary>
  16.         bool DeleteStreetInfo(int intID);
复制代码
6)实现文件代码:
  1.         /// <summary>
  2.         /// 功能简述:更新街道资讯资料
  3.         ///  撰写人员:Konson
  4.         /// 撰写日期:2012/09/19
  5.         /// 修改人员:
  6.         /// 修改日期:
  7.         /// </summary>
  8.         public bool UpdateStreetInfo(StreetInfo streetinfo)
  9.         {
  10.             bool boolSuccess = true;
  11.             entity.Connection.Open();
  12.             var var_transaction = entity.Connection.BeginTransaction(IsolationLevel.Serializable);
  13.             try
  14.             {
  15.                 var var_StreetInfo = from s in entity.StreetInfo
  16.                                      where s.id == streetinfo.id
  17.                                      select s;
  18.                 foreach (var v in var_StreetInfo)
  19.                 {
  20.                     v.name = streetinfo.name;
  21.                     v.description = streetinfo.description;
  22.                     if (streetinfo.imageUrl != null && streetinfo.imageUrl != "")
  23.                     {
  24.                         v.imageUrl = streetinfo.imageUrl;
  25.                     }
  26.                     v.lastupdatetime = streetinfo.lastupdatetime;
  27.                 }
  28.                 entity.SaveChanges();
  29.                 var_transaction.Commit();
  30.             }
  31.             catch
  32.             {
  33.                 boolSuccess = false;
  34.                 var_transaction.Rollback();
  35.             }
  36.             finally
  37.             {
  38.                 var_transaction.Dispose();
  39.                 entity.Connection.Close();
  40.             }
  41.             return boolSuccess;
  42.         }

  43.         /// <summary>
  44.         /// 功能简述:刪除街道资讯资料
  45.         /// 撰写人员:Konson
  46.         /// 撰写日期:2012/09/19
  47.         /// 修改人员:
  48.         /// 修改日期:
  49.         /// </summary>
  50.         public bool DeleteStreetInfo(int intID)
  51.         {
  52.             bool boolSuccess = true;
  53.             entity.Connection.Open();
  54.             var var_transaction = entity.Connection.BeginTransaction(IsolationLevel.Serializable);
  55.             try
  56.             {
  57.                 var var_StreetInfo = entity.StreetInfo.SingleOrDefault(s => s.id == intID );
  58.                 entity.StreetInfo.DeleteObject(var_StreetInfo);
  59.                 entity.SaveChanges();
  60.                 var_transaction.Commit();
  61.             }
  62.             catch
  63.             {
  64.                 boolSuccess = false;
  65.                 var_transaction.Rollback();
  66.             }
  67.             finally
  68.             {
  69.                 var_transaction.Dispose();
  70.                 entity.Connection.Close();
  71.             }
  72.             return boolSuccess;
  73.         }
复制代码
也有使用到了事务哦,时间问题,具体就不多做介绍了,有问题的地方可以直接与小版主交流哦,QQ或者Email我吧。

7)最后是一个查询操作哦,接口文件代码:
  1.         /// <summary>
  2.         /// 功能简述:获取全部街道资讯资料
  3.         /// 撰写人员:Konson
  4.         /// 撰写日期:2012/09/19
  5.         /// 修改人员:
  6.         /// 修改日期:
  7.         /// </summary>
  8.         [OperationContract]
  9.         //[WebGet]
  10.         [WebInvoke(Method="GET",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
  11.         string GetStreetInfoAll();

  12.        /// <summary>
  13.         /// 功能简述:根据ID获取街道资讯资料
  14.         /// 撰写人员:Konson
  15.         /// 撰写日期:2012/09/19
  16.         /// 修改人员:
  17.         /// 修改日期:
  18.         /// </summary>
  19.         [OperationContract]
  20.         //[WebGet]
  21.         [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
  22.         string GetStreetInfoByID(int intID);
复制代码
8)实现文件代码:
  1.         /// <summary>
  2.         /// 功能简述:获取全部街道资讯资料
  3.         /// 撰写人员:Konson
  4.         /// 撰写日期:2012/09/15
  5.         /// 修改人员:
  6.         /// 修改日期:
  7.         /// </summary>
  8.         public string GetStreetInfoAll()
  9.         {
  10.             List<StreetInfo> list = new List<StreetInfo>();
  11.             var var_list = from s in entity.StreetInfo select s;
  12.             foreach (var v in var_list)
  13.             {
  14.                 list.Add(v);
  15.             }
  16.             list.ForEach(e => entity.Detach(e));
  17.             var var_str = list.Select(e => GetNonEntityPropertyValues(e));
  18.             string strJson = ServiceStack.Text.JsonSerializer.SerializeToString(var_str);
  19.             return strJson;   
  20.         }

  21.         /// <summary>
  22.         /// 功能简述:根据ID获取街道资讯资料
  23.         /// 撰写人员:Konson
  24.         /// 撰写日期:2012/09/15
  25.         /// 修改人员:
  26.         /// 修改日期:
  27.         /// </summary>
  28.         public string GetStreetInfoByID(int intID)
  29.         {
  30.             var var_list = from s in entity.StreetInfo
  31.                            where s.id == intID
  32.                            select s;
  33.             var list = var_list.ToList();
  34.             list.ForEach(e => entity.Detach(e));
  35.             var var_str = list.Select(e => GetNonEntityPropertyValues(e));
  36.             string strJson = ServiceStack.Text.JsonSerializer.SerializeToString(var_str);
  37.             return strJson;
  38.         }
复制代码
9)对于这个linq的写法其实和sql还是很相似的,之前说过,了解一下拉姆达表达式对于理解非常有帮助。其到底又多强大和方法,不妨试一试写一写体会一下便知。熟悉它还是需要经常反复的使用。以后的博文再一起分析吧。

10)代码中可以看到这么一句 string strJson = ServiceStack.Text.JsonSerializer.SerializeToString(var_str);其实这个是讲其序列化成json的一个操作,用到了一个dll,因为好似不能上传这个dll,所以就不分享了,可以去网上下载,如果有需要,也可以直接QQ我或者Email我,我也可以传给你(ServiceStack.Text.dll)。

11)最后值得一说的便是这一行代码了:var var_str = list.Select(e => GetNonEntityPropertyValues(e));因为在数据库各表之间有些主外键或者其它因素,便导致这个list生成的结果并非我们所需要的,带上了一些properties,如EntityKey之类,给你做解析带来了非常的不便如下所示:
  1. {"d":"[{"id":1,"normal_fare":"全線空調","air_cond_fare":9.8,","EntityKey":{"EntitySetName":"bus_stop","EntityContainerName":"TrafficCheckEntities","EntityKeyValues":[{"Key":"id","Value":1}]}},
复制代码
其实我需要的结果是这样的:
  1. {"d":"[{"id":1,"normal_fare":"全線空調","air_cond_fare":9.8,"}
复制代码
对于这个问题我在国内的网站论坛是没有找到什么解决的办法的。最后是一个香港的同事给我提供了一个方法,就是GetNonEntityPropertyValues()这个方法了。代码如下:
  1. /// <summary>
  2.         /// 功能简介:在result當中,有幾個properties如EntityKey等無需要的properties,為了拿走這些properties請加入這個function
  3.         /// 撰写人员:Kenny...
  4.         /// 撰写日期:2012/6/27
  5.         /// 修改人员:
  6.         /// 修改日期:
  7.         /// </summary>
  8.         public IDictionary<string, object> GetNonEntityPropertyValues(object obj)
  9.         {
  10.             var dictionary = new Dictionary<string, object>();

  11.             foreach (var property in obj.GetType().GetProperties())
  12.             {
  13.                 var propertyValue = property.GetValue(obj, null);
  14.                 if (!property.Name.Contains("Entity") && !property.Name.Contains("Reference"))
  15.                 {
  16.                     dictionary.Add(property.Name, propertyValue);
  17.                 }
  18.             }
  19.             return dictionary;
  20.         }
复制代码
12)至于在需要调用WCF的程序里,得到这个json如何解析呢?可以使用Newtonsoft.Json.dll,
  1.        /// <summary>
  2.         /// 功能简述:綁定每週街道資訊Store
  3.         /// 撰写人员:Konson
  4.         /// 撰写日期:2012/09/15
  5.         /// 修改人员:
  6.         /// 修改日期:
  7.         /// </summary>
  8.         private void BindStroe()
  9.         {
  10.             string strUrl = "http://localhost:53224/HK.svc/GetXXXXAll";
  11.             string strJson= WebRequestExtensions.GetJsonFromUrl(strUrl);
  12.             JObject jobject = JObject.Parse(strJson);
  13.             var var_store = JArray.Parse(jobject["d"].ToString());
  14.             StoreStreetInfo.DataSource = var_store;
  15.             StoreStreetInfo.DataBind();
  16.         }
复制代码
记得下载Newtonsoft.Json.dll 引入项目并且引入命名空间哦。

13)好了,分享就到这里了吧。有问题就和小版主一起交流吧。




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-2 04:43

© 2014-2021

快速回复 返回顶部 返回列表