1 2 3 4 |
<connectionStrings> <add name="ConnectionStringName" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=DataBaseName;Integrated Security=True;Pooling=False" /> </connectionStrings> |
必须写在
1 2 3 4 |
<configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> |
之后 。 from:http://www.cnblogs.com/A2008A/archive/2012/08/10/2631443.html
View DetailsC#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破。使用Dotfuscator可以实现混淆代码、变量名修改、字符串加密等功能。 这里介绍的是DotfuscatorPro_4.9.7750_2.0 版本,有需要的可以到网上搜索下载https://skydrive.live.com/?cid=d2b11227abf128d8&id=D2B11227ABF128D8%21104。安装 Dotfuscator 好 打开界面,有几个需要配置的地方: Options、Input、Rename、String Encryption、Build,其他的默认即可,下面一一讲解。 Settings->Global Options 这是全局配置选项: 把 Disable String Encryption 设为 NO,即启用字符串加密;检查 Disable Control flow、Dsiable Renaming 也为 NO,即保证控制流和混淆功能打开,其他默认。如下图: Input 选项里 选择你需要混淆加密的 dll、exe文件,其中Library不要勾选,否则有些类、变量等等不会混淆; Rename 选项 勾选“use enhanced overload induction”(使用增强模式),注意:不要勾选下方的“ Do not suppress on serializable types”,即序列化类型的变量不加密,否则编译后可能异常; “Renaming Scheme” 选择“Unprintable”(不可打印字符,即乱码),也可以选择其他如小写字母、大写字符、数字的方式。如下图: String Encryption 选项 include里勾选需要字符串加密的工程文件exe、dll等。 Settings->Build Settings 选项 设置输出目标文件夹,点击上方的按钮即可重新生成新的 exe、dll文件了。 好了,我们来看一下加密混淆后的效果: 原来的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static readonly int A = B * 10; static readonly int B = 10; //const int A = B * 10; //const int B = 10; public static void Main(string[] args) { Person p = new Person(); Console.WriteLine("A is {0},B is {1} ", A, B); } } public class Person { static int age; […]
View Details一:背景 我们知道传统的http采用的是“拉模型”,也就是每次请求,每次断开这种短请求模式,这种场景下,client是老大,server就像一个小乌龟任人摆布, 很显然,只有一方主动,这事情就没那么完美了,所以为了能够让server也能主动点,html5就应运而生了,或许大家都知道html5中有两种server的主动 模型,第一种叫做websockect,也就是基于tcp模式的双工通讯,还有一种叫做SSE,也就是客户端来订阅服务器的一种事件模型,当然了,在html5出 来之前,如果要做到服务器主动,我们只能采用变相的longpool和foreverframe勉强实现,而signalR这吊毛就是一个对他们进行了高层封装,也就是说 signalR会在这四种技术中根据浏览器和服务器设置采取最优的一种模式,废话不多说,我们快速建立一个例子。 二:快速搭建 这里我们采用 PersistentConnection模式来构建一个持久连接让大家快速接触下: 1. PersistentConnection 在新建项目中,我们选择”Sig“这里我们就使用默认的名字MyConnection1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web; using Microsoft.AspNet.SignalR; namespace WebApplication1 { public class MyConnection1 : PersistentConnection { protected override Task OnConnected(IRequest request, string connectionId) { return Connection.Send(connectionId, "Welcome!"); } protected override Task OnReceived(IRequest request, string connectionId, string data) { return Connection.Broadcast(data); } } } |
在上面,我们简单的看出来了,"持久连接“类有点像socket连接,有OnConnected和OnReceived事件,这里我们就不过多介绍,只要知道 Connection.Send方法中有一个叫做connectionID就好了,而这个connectionID就是客户端和服务器建立连接的唯一标识,比如上面我们看到的 return Connection.Send(connectionId, "Welcome!");就是当客户端连接到服务器之后,服务器主动将客户端推送一个”Welcome",以示欢迎。 2. Startup类 由于signalR采用的是Owin中间件的模式来把signalR和FCL进行隔离,这样的话,大家就可以相互独立,谁也不依赖于谁,也就方便signalR快速独立 发展和更新,而Startup类的Configuration方法就是将一些中间件配置送到Owin管道中,下面我们要做的就是把MyConnection1和"/myconnection" 地址的映射送到Owin管道中,这样当我访问”/myconnection“的时候,就可以触发MyConnection1这个类了,如下图:
1 2 3 4 5 6 7 8 9 10 11 12 |
[assembly: OwinStartup(typeof(WebApplication1.Startup1))] namespace WebApplication1 { public class Startup1 { public void Configuration(IAppBuilder app) { app.MapSignalR<MyConnection1>("/myconnection"); } } } |
3:新建客户端 这里我们采用web客户端的形式来连接server,这就必须引用一些js文件,比如这里的signalR.js和jquery.js,如下图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <meta charset="utf-8" /> </head> <body> <script src="/scripts/jquery-1.10.2.js"></script> <script src="/scripts/jquery.signalR-2.1.2.js"></script> <script type="text/javascript"> var conn = $.connection("/myconnection"); conn.start().done(function (data) { console.log("当前clientID=" + data.id); }); //接受服务器的推送 conn.received(function (data) { console.log("server返回的数据: " + data); }); </script> </body> </html> |
上面的代码很简单,第一个就是$.connection("/myconnection")用于找到对应的服务器端的Myconnection处理类,第二个start()方法就是开始建 立连接,后面的 received事件就是获取服务器端推送过来的消息,也就是welcome,对吧。。。然后我们在chrome中试试看。 现在,你可以对应代码看一看,start方法成功的拿到了connectionID,而received方法成功的拿到了服务器推送的"welcome"数据,对吧。 四:用Fiddler监视一下 下面就是我用Fiddler监视到的截图,从图中的http 101状态码就可以看出,这里将http协议转换成了websocket协议。然后我们从websocket 协议中看到了服务器端推送过来的“welcome”数据。 好了,本篇大概就这么说了,是不是非常简单,当然里面还有很多的细节没有说,后续我们来慢慢解读。 from:http://www.cnblogs.com/huangxincheng/p/5280630.html
View DetailsStringBuilder sb = new StringBuilder(); sb.AppendFormat("{0:X2}", 10); Response.Write(sb); 输出A X2表示十六进制格式(大写),域宽2位,不足的左边填0。 [csharp] view plain copy int[] recvLen = { 10, 11, 12, 13, 14, 15, 16, 17, 18 }; StringBuilder uid = new StringBuilder(); for (int i = 0; i <= recvLen.Length – 1; i++) uid.AppendFormat("{0:X2}\r\n", recvLen[i]); Console.WriteLine(uid.ToString()); 输出: 0A 0B 0C 0D 0E 0F 10 11 12 from:http://blog.csdn.net/joyhen/article/details/41576841
View Details目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1、建立项目 从这一部分开始做后台管理,首先是基本框架的 一、Data项目 1、项目添加EntityFramework引用 在Data项目的引用上右键-> 管理NuGet程序包。 在弹出的窗口中选择 EntityFramework 安装 2、添加排序枚举 在Data项目上点右键新建文件夹Type。在文件夹内添加类【OrderType】,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//创建2014.12.8 namespace Data.Types { /// <summary> /// 排序类型 /// </summary> public enum OrderType { /// <summary> /// 不排序 /// </summary> No, /// <summary> /// 正序 /// </summary> Asc, /// <summary> /// 倒序 /// </summary> Desc } } |
3、添加数据访问类 在Data项目上点右键新建类输入类名【BaseRepository】,这个类主要负责数数据的存取。 类内添加私有成员DbContext _baseDbContext用来在数据库进行增、删、改和查询。 BaseRepository的构造函数public BaseRepository(DbContext dbContext)中dbContext为数据上下文。在该类中写了一些数据的增删改和查询方法。整个代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
using Ninesky.Data.Types; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; namespace Ninesky.Data { /// <summary> /// 数据仓储基类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> /// <typeparam name="T"></typeparam> public class BaseRepository<T> where T : class { private DbContext _baseDbContext; /// <summary> /// 构造函数 /// </summary> /// <param name="dbContext">数据上下文</param> public BaseRepository(DbContext dbContext) { _baseDbContext = dbContext; } /// <summary> /// 添加 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public T Add(T entity, bool isSave = true) { _baseDbContext.Set<T>().Add(entity); if (isSave) _baseDbContext.SaveChanges(); return entity; } /// <summary> /// 批量添加【立即执行】 /// </summary> /// <param name="entities">数据列表</param> /// <returns>添加的记录数</returns> public int AddRange(IEnumerable<T> entities, bool isSave = true) { _baseDbContext.Set<T>().AddRange(entities); return isSave ? _baseDbContext.SaveChanges() : 0; } /// <summary> /// 修改 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Update(T entity, bool isSave = true) { _baseDbContext.Set<T>().Attach(entity); _baseDbContext.Entry<T>(entity).State = EntityState.Modified; return isSave ? _baseDbContext.SaveChanges() > 0 : true; } /// <summary> /// 删除 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Delete(T entity, bool isSave = true) { _baseDbContext.Set<T>().Attach(entity); _baseDbContext.Entry<T>(entity).State = EntityState.Deleted; return isSave ? _baseDbContext.SaveChanges() > 0 : true; } /// <summary> /// 批量删除 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns>删除的记录数</returns> public int DeleteRange(IEnumerable<T> entities, bool isSave = true) { _baseDbContext.Set<T>().RemoveRange(entities); return isSave ? _baseDbContext.SaveChanges() : 0; } /// <summary> /// 保存 /// </summary> /// <returns>受影响的记录数</returns> public int Save() { return _baseDbContext.SaveChanges(); } /// <summary> /// 是否有满足条件的记录 /// </summary> /// <param name="anyLamdba">条件表达式</param> /// <returns></returns> public bool Any(Expression<Func<T, bool>> anyLamdba) { return _baseDbContext.Set<T>().Any(anyLamdba); } /// <summary> /// 查询记录数 /// </summary> /// <param name="countLamdba">查询表达式</param> /// <returns>记录数</returns> public int Count(Expression<Func<T, bool>> countLamdba) { return _baseDbContext.Set<T>().Count(countLamdba); } /// <summary> /// 查找实体 /// </summary> /// <param name="ID">实体ID</param> /// <returns></returns> public T Find(int ID) { return _baseDbContext.Set<T>().Find(ID); } /// <summary> /// 查找实体 /// </summary> /// <param name="findLambda">Lambda表达式</param> /// <returns></returns> public T Find(Expression<Func<T, bool>> findLambda) { return _baseDbContext.Set<T>().SingleOrDefault(findLambda); } /// <summary> /// 查找所有列表 /// </summary> /// <returns></returns> public IQueryable<T> FindAll() { return FindList<int>(0, T => true, OrderType.No, null); } /// <summary> /// 查找数据列表 /// </summary> /// <param name="number">返回的记录数【0-返回所有】</param> /// <param name="whereLandba">查询条件</param> /// <param name="orderType">排序方式</param> /// <param name="orderLandba">排序条件</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba); switch (orderType) { case OrderType.Asc: _tIQueryable = _tIQueryable.OrderBy(orderLandba); break; case OrderType.Desc: _tIQueryable = _tIQueryable.OrderByDescending(whereLandba); break; } if (number > 0) _tIQueryable = _tIQueryable.Take(number); return _tIQueryable; } /// <summary> /// /// </summary> /// <typeparam name="TKey">排序字段类型</typeparam> /// <param name="pageIndex">页码【从1开始】</param> /// <param name="pageNumber">每页记录数</param> /// <param name="totalNumber">总记录数</param> /// <param name="whereLandba">查询表达式</param> /// <param name="orderType">排序类型</param> /// <param name="orderLandba">排序表达式</param> /// <returns></returns> public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba); totalNumber = _tIQueryable.Count(); switch (orderType) { case OrderType.Asc: _tIQueryable = _tIQueryable.OrderBy(orderLandba); break; case OrderType.Desc: _tIQueryable = _tIQueryable.OrderByDescending(whereLandba); break; } _tIQueryable = _tIQueryable.Skip((pageIndex - 1) * pageNumber).Take(pageNumber); return _tIQueryable; } } } |
4、添加业务逻辑基类 在data项目右键添加【BaseService】,此类通过调用BaseRepository进行数据处理,作为业务逻辑的基类,其他业务类继承自此类。这个类的方法与BaseRepository比较相似,建立此类的主要体现分层的思路,一些数据访问的异常处理应该放在此类中。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
using Ninesky.Data.Types; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; namespace Ninesky.Data { /// <summary> /// 业务逻辑基类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class BaseService<T> where T : class { private BaseRepository<T> _baseRepository; /// <summary> /// 创建业务逻辑类 /// </summary> /// <param name="dbContext">数据上下文</param> public BaseService(DbContext dbContext) { _baseRepository = new BaseRepository<T>(dbContext); } /// <summary> /// 添加 /// </summary> /// <param name="entity">数据实体</param> /// <returns>添加后的数据实体</returns> public T Add(T entity, bool isSave = true) { return _baseRepository.Add(entity, isSave); } ///// <summary> ///// 添加【必须先实例化才能使用】 ///// </summary> ///// <param name="entity">数据实体</param> ///// <returns>添加后的记录ID</returns> //public virtual int Add(T entity) { return 0; } /// <summary> /// 批量添加 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public int AddRange(IEnumerable<T> entities, bool isSave = true) { return _baseRepository.AddRange(entities, isSave); } /// <summary> /// 修改 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Update(T entity, bool isSave = true) { return _baseRepository.Update(entity, isSave); } /// <summary> /// 删除 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Delete(T entity, bool isSave = true) { return _baseRepository.Delete(entity, isSave); } /// <summary> /// 批量删除 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns>删除的记录数</returns> public int DeleteRange(IEnumerable<T> entities, bool isSave = true) { return _baseRepository.DeleteRange(entities, isSave); } /// <summary> /// 保存 /// </summary> /// <returns>受影响的记录数</returns> public int Save() { return _baseRepository.Save(); } /// <summary> /// 查询记录数 /// </summary> /// <param name="countLamdba">查询表达式</param> /// <returns>记录数</returns> public int Count(Expression<Func<T, bool>> countLamdba) { return _baseRepository.Count(countLamdba); } /// <summary> /// 查找实体 /// </summary> /// <param name="ID">实体ID</param> /// <returns></returns> public T Find(int ID) { return _baseRepository.Find(ID); } /// <summary> /// 查找实体 /// </summary> /// <param name="findLambda">Lambda表达式</param> /// <returns></returns> public T Find(Expression<Func<T, bool>> findLambda) { return _baseRepository.Find(findLambda); } /// <summary> /// 查找所有列表 /// </summary> /// <returns></returns> public IQueryable<T> FindAll() { return _baseRepository.FindAll(); } /// <summary> /// 查找数据列表 /// </summary> /// <param name="number">返回的记录数【0-返回所有】</param> /// <param name="whereLandba">查询条件</param> /// <param name="orderType">排序方式</param> /// <param name="orderLandba">排序条件</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { return _baseRepository.FindList<TKey>(number, whereLandba, orderType, orderLandba); } /// <summary> /// /// </summary> /// <typeparam name="TKey">排序字段类型</typeparam> /// <param name="pageIndex">页码【从1开始】</param> /// <param name="pageNumber">每页记录数</param> /// <param name="totalNumber">总记录数</param> /// <param name="whereLandba">查询表达式</param> /// <param name="orderType">排序类型</param> /// <param name="orderLandba">排序表达式</param> /// <returns></returns> public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { return FindPageList<TKey>(pageIndex, pageNumber, out totalNumber, whereLandba, orderType, orderLandba); } } } |
二、User项目 1、建立管理员模型 在User项目的引用上点右键添加System.ComponentModel.DataAnnotations的引用和Ninesky.Data项目、E的引用。 在User项目上点右键新建文件夹Models,在文件夹中添加类Administrator。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.User.Models { /// <summary> /// 管理员模型 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class Administrator { [Key] public int AdministratorID { get; set; } /// <summary> /// 管理员账号 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "管理员账号")] public string Account { get; set; } /// <summary> /// 管理员名称 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "管理员名称")] public string Name { get; set; } /// <summary> /// 密码 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "密码")] [DataType(DataType.Password)] public string Password { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreateDate { get; set; } /// <summary> /// 上次登陆Ip /// </summary> public string LoginIp { get; set; } /// <summary> /// 上次登陆日期 /// </summary> public Nullable<DateTime> LoginTime { get; set; } } } |
2、建立管理员业务逻辑类 在User项目上点右键添加AdministratorService类,该类继承自BaseService。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Ninesky.Data; using Ninesky.User.Models; namespace Ninesky.User { /// <summary> /// 管理员业务逻辑类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class AdministratorService:BaseService<Administrator> { public AdministratorService(DbContext dbContext) : base(dbContext) { } } } |
三、Website项目 1、添加User项目的引用上右键添加对User项目的引用。 2、建立数据上下文 在Site项目上点右键添加类【NineskyDbContext】,继承自DbContext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using Ninesky.User.Models; namespace Ninesky.Website { /// <summary> /// 网站数据上下文 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class NineskyDbContext : DbContext { public DbSet<Administrator> Administrators { get; set; } public NineskyDbContext() : base("name=NineskyConnection") { Database.SetInitializer<NineskyDbContext>(new CreateDatabaseIfNotExists<NineskyDbContext>()); } } } |
3、建立数据库连接 打开Web.config文件,在</configSections><appSettings>之间添加数据库的连接
1 2 3 |
<connectionStrings> <add name="NineskyConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Ninesky.mdf;Initial Catalog=Ninesky;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings> |
4、建立简单工厂 在Website项目上点右键添加类【ContextFactory】,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Runtime.Remoting.Messaging; namespace Ninesky.Website { /// <summary> /// 上下文简单工厂 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class ContextFactory { /// <summary> /// 获取当前数据上下文 /// </summary> /// <returns>数据上下文</returns> public static NineskyDbContext GetCurrentContext() { NineskyDbContext _nineskyDbContext = CallContext.GetData("NineskyDbContext") as NineskyDbContext; if (_nineskyDbContext == null) { _nineskyDbContext = new NineskyDbContext(); CallContext.SetData("NineskyDbContext", _nineskyDbContext); } return _nineskyDbContext; } } } |
5、Config区域主界面 在Site项目的Config区域的Controller文件夹上点右键添加Home控制器,类型选择【MVC5控制器-空】。在添加的控制器中添加【Index】 action
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace Ninesky.Website.Areas.Config.Controllers { /// <summary> /// 主界面 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class HomeController : Controller { // GET: Config/Home public ActionResult Index() { return View(); } } } |
在Config区域Views/Share文件夹添加布局页【_Layout.cshtml】 在Index action上右键添加一个空视图 =========================== 代码下载:http://pan.baidu.com/s/1sj6Ya2D from:http://www.cnblogs.com/mzwhj/p/4155896.html
View Details单条: WeiXinOpenId weiXinOpenId = _db.WeiXinOpenId.Find(1); _db.WeiXinOpenId.Remove(weiXinOpenId); _db.SaveChanges(); 另一种方法: WeiXinOpenId weiXinOpenId = _db.WeiXinOpenId.Find(1); _db.Entry(weiXinOpenId).State = EntityState.Deleted; _db.SaveChanges(); ================================================ 批量: var openids = _db.WeiXinOpenId.Where(item => item.Uid == uid).ToList(); _db.WeiXinOpenId.RemoveRange(openids); return _db.SaveChanges();
View Details我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 。 Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加、合并、取相同项、相交项等等。 Concat(连接) 说明:连接不同的集合,不会自动过滤相同项;延迟。 1.简单形式:
1 2 3 4 5 6 7 8 9 10 |
var q = ( from c in db.Customers select c.Phone ).Concat( from c in db.Customers select c.Fax ).Concat( from e in db.Employees select e.HomePhone ); |
语句描述:返回所有消费者和雇员的电话和传真。 2.复合形式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var q = ( from c in db.Customers select new { Name = c.CompanyName, c.Phone } ).Concat( from e in db.Employees select new { Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone } ); |
语句描述:返回所有消费者和雇员的姓名和电话。 Union(合并) 说明:连接不同的集合,自动过滤相同项;延迟。即是将两个集合进行合并操作,过滤相同的项。
1 2 3 4 5 6 7 |
var q = ( from c in db.Customers select c.Country ).Union( from e in db.Employees select e.Country ); |
语句描述:查询顾客和职员所在的国家。 Intersect(相交) 说明:取相交项;延迟。即是获取不同集合的相同项(交集)。即先遍历第一个集合,找出所有唯一的元素,然后遍历第二个集合,并将每个元素与前面找出的元素作对比,返回所有在两个集合内都出现的元素。
1 2 3 4 5 6 7 |
var q = ( from c in db.Customers select c.Country ).Intersect( from e in db.Employees select e.Country ); |
语句描述:查询顾客和职员同在的国家。 Except(与非) 说明:排除相交项;延迟。即是从某集合中删除与另一个集合中相同的项。先遍历第一个集合,找出所有唯一的元素,然后再遍历第二个集合,返回第二个集合中所有未出现在前面所得元素集合中的元素。
1 2 3 4 5 6 7 |
var q = ( from c in db.Customers select c.Country ).Except( from e in db.Employees select e.Country ); |
语句描述:查询顾客和职员不同的国家。 Top/Bottom操作 适用场景:适量的取出自己想要的数据,不是全部取出,这样性能有所加强。 Take 说明:获取集合的前n个元素;延迟。即只返回限定数量的结果集。
1 2 3 4 5 |
var q = ( from e in db.Employees orderby e.HireDate select e) .Take(5); |
语句描述:选择所雇用的前5个雇员。 Skip 说明:跳过集合的前n个元素;延迟。即我们跳过给定的数目返回后面的结果集。
1 2 3 4 5 |
var q = ( from p in db.Products orderby p.UnitPrice descending select p) .Skip(10); |
语句描述:选择10种最贵产品之外的所有产品。 TakeWhile 说明:直到某一条件成立就停止获取;延迟。即用其条件去依次判断源序列中的元素,返回符合判断条件的元素,该判断操作将在返回false或源序列的末尾结束 。 SkipWhile 说明:直到某一条件成立就停止跳过;延迟。即用其条件去判断源序列中的元素并且跳过第一个符合判断条件的元素,一旦判断返回false,接下来将不再进行判断并返回剩下的所有元素。 Paging(分页)操作 适用场景:结合Skip和Take就可实现对数据分页操作。 1.索引
1 2 3 4 5 6 |
var q = ( from c in db.Customers orderby c.ContactName select c) .Skip(50) .Take(10); |
语句描述:使用Skip和Take运算符进行分页,跳过前50条记录,然后返回接下来10条记录,因此提供显示Products表第6页的数据。 2.按唯一键排序
1 2 3 4 5 6 |
var q = ( from p in db.Products where p.ProductID > 50 orderby p.ProductID select p) .Take(10); |
语句描述:使用Where子句和Take运算符进行分页,首先筛选得到仅50 (第5页最后一个ProductID)以上的ProductID,然后按ProductID排序,最后取前10个结果,因此提供Products表第6页的数据。请注意,此方法仅适用于按唯一键排序的情况。 SqlMethods操作 在LINQ to SQL语句中,为我们提供了SqlMethods操作,进一步为我们提供了方便,例如Like方法用于自定义通配表达式,Equals用于相比较是否相等。 Like 自定义的通配表达式。%表示零长度或任意长度的字符串;_表示一个字符;[]表示在某范围区间的一个字符;[^]表示不在某范围区间的一个字符。比如查询消费者ID以“C”开头的消费者。
1 2 3 |
var q = from c in db.Customers where SqlMethods.Like(c.CustomerID, "C%") select c; |
比如查询消费者ID没有“AXOXT”形式的消费者:
1 2 3 |
var q = from c in db.Customers where !SqlMethods.Like(c.CustomerID, "A_O_T") select c; |
DateDiffDay 说明:在两个变量之间比较。分别有:DateDiffDay、DateDiffHour、DateDiffMillisecond、DateDiffMinute、DateDiffMonth、DateDiffSecond、DateDiffYear
1 2 3 4 |
var q = from o in db.Orders where SqlMethods .DateDiffDay(o.OrderDate, o.ShippedDate) < 10 select o; |
语句描述:查询在创建订单后的 10 天内已发货的所有订单。 已编译查询操作(Compiled Query) 说明:在之前我们没有好的方法对写出的SQL语句进行编辑重新查询,现在我们可以这样做,看下面一个例子:
1 2 3 4 5 6 7 8 9 10 11 |
//1.创建compiled query NorthwindDataContext db = new NorthwindDataContext(); var fn = CompiledQuery.Compile( (NorthwindDataContext db2, string city) => from c in db2.Customers where c.City == city select c); //2.查询城市为London的消费者,用LonCusts集合表示,这时可以用数据控件绑定 var LonCusts = fn(db, "London"); //3.查询城市为Seattle的消费者 var SeaCusts = fn(db, "Seattle"); |
语句描述:这个例子创建一个已编译查询,然后使用它检索输入城市的客户。 本系列链接:LINQ体验系列文章导航 LINQ推荐资源 LINQ专题:http://kb.cnblogs.com/zt/linq/ 关于LINQ方方面面的入门、进阶、深入的文章。 LINQ小组:http://space.cnblogs.com/group/linq/ 学习中遇到什么问题或者疑问提问的好地方。 from:http://www.cnblogs.com/lyj/archive/2008/01/27/1054995.html
View Details我们继续讲解LINQ to SQL语句,这篇我们来讨论Group By/Having操作符和Exists/In/Any/All/Contains操作符。 Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围。 说明:分配并返回对传入参数进行分组操作后的可枚举对象。分组;延迟 1.简单形式:
1 2 3 4 |
var q = from p in db.Products group p by p.CategoryID into g select g; |
语句描述:使用Group By按CategoryID划分产品。 说明:from p in db.Products 表示从表中将产品对象取出来。group p by p.CategoryID into g表示对p按CategoryID字段归类。其结果命名为g,一旦重新命名,p的作用域就结束了,所以,最后select时,只能select g。当然,也不必重新命名可以这样写:
1 2 3 |
var q = from p in db.Products group p by p.CategoryID; |
我们用示意图表示: 如果想遍历某类别中所有记录,这样:
1 2 3 4 5 6 7 8 9 10 |
foreach (var gp in q) { if (gp.Key == 2) { foreach (var item in gp) { //do something } } } |
2.Select匿名类:
1 2 3 4 |
var q = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, g }; |
说明:在这句LINQ语句中,有2个property:CategoryID和g。这个匿名类,其实质是对返回结果集重新进行了包装。把g的property封装成一个完整的分组。如下图所示: 如果想遍历某匿名类中所有记录,要这么做:
1 2 3 4 5 6 7 8 9 10 |
foreach (var gp in q) { if (gp.CategoryID == 2) { foreach (var item in gp.g) { //do something } } } |
3.最大值
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, MaxPrice = g.Max(p => p.UnitPrice) }; |
语句描述:使用Group By和Max查找每个CategoryID的最高单价。 说明:先按CategoryID归类,判断各个分类产品中单价最大的Products。取出CategoryID值,并把UnitPrice值赋给MaxPrice。 4.最小值
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, MinPrice = g.Min(p => p.UnitPrice) }; |
语句描述:使用Group By和Min查找每个CategoryID的最低单价。 说明:先按CategoryID归类,判断各个分类产品中单价最小的Products。取出CategoryID值,并把UnitPrice值赋给MinPrice。 5.平均值
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, AveragePrice = g.Average(p => p.UnitPrice) }; |
语句描述:使用Group By和Average得到每个CategoryID的平均单价。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品中单价的平均值。 6.求和
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, TotalPrice = g.Sum(p => p.UnitPrice) }; |
语句描述:使用Group By和Sum得到每个CategoryID 的单价总计。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品中单价的总和。 7.计数
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, NumProducts = g.Count() }; |
语句描述:使用Group By和Count得到每个CategoryID中产品的数量。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品的数量。 8.带条件计数
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, NumProducts = g.Count(p => p.Discontinued) }; |
语句描述:使用Group By和Count得到每个CategoryID中断货产品的数量。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品的断货数量。 Count函数里,使用了Lambda表达式,Lambda表达式中的p,代表这个组里的一个元素或对象,即某一个产品。 9.Where限制
1 2 3 4 5 6 7 8 |
var q = from p in db.Products group p by p.CategoryID into g where g.Count() >= 10 select new { g.Key, ProductCount = g.Count() }; |
语句描述:根据产品的―ID分组,查询产品数量大于10的ID和产品数量。这个示例在Group By子句后使用Where子句查找所有至少有10种产品的类别。 说明:在翻译成SQL语句时,在最外层嵌套了Where条件。 10.多列(Multiple Columns)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var categories = from p in db.Products group p by new { p.CategoryID, p.SupplierID } into g select new { g.Key, g }; |
语句描述:使用Group By按CategoryID和SupplierID将产品分组。 说明: 既按产品的分类,又按供应商分类。在by后面,new出来一个匿名类。这里,Key其实质是一个类的对象,Key包含两个Property:CategoryID、SupplierID。用g.Key.CategoryID可以遍历CategoryID的值。 11.表达式(Expression)
1 2 3 4 |
var categories = from p in db.Products group p by new { Criterion = p.UnitPrice > 10 } into g select g; |
语句描述:使用Group By返回两个产品序列。第一个序列包含单价大于10的产品。第二个序列包含单价小于或等于10的产品。 说明:按产品单价是否大于10分类。其结果分为两类,大于的是一类,小于及等于为另一类。 Exists/In/Any/All/Contains操作符 适用场景:用于判断集合中元素,进一步缩小范围。 Any 说明:用于判断集合中是否有元素满足某一条件;不延迟。(若条件为空,则集合只要不为空就返回True,否则为False)。有2种形式,分别为简单形式和带条件形式。 1.简单形式: 仅返回没有订单的客户:
1 2 3 4 |
var q = from c in db.Customers where !c.Orders.Any() select c; |
[…]
View Details如何在ASP.NET中用C#将XML转换成JSON 本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用。或许你可以直接利用JavaScript代码通过Ajax的方式来读取XML,然后直接对其中的内容进行解析,这样或许更直接一些。但本文中给出的代码旨在说明如何通过原生的C#代码来完成这一转换。除此之外,你仍然可以借用一些第三方类库或者更高级一些的.NET库对象来实施转换。我们来看看这里介绍的一些较为简单的方法,但前提是你必须拥有可支持的类库和对象以备使用。 使用Json.NET类库 前提是需要首先下载和安装Json.NET类库,在这里可以找到http://json.codeplex.com/ 下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using Newtonsoft.Json; namespace JSonConverter { class Program { static void Main(string[] args) { string xml = "<Test><Name>Test class</Name><X>100</X><Y>200</Y></Test>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc); Console.WriteLine("XML -> JSON: {0}", json); Console.ReadLine(); } } } |
使用.NET Framework中的JavaScriptSerializer类 首先需要确保你的工程或服务器支持.NET 4.0或以上版本的Framework,否则无法找到该类。 下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System; using System.Linq; using System.Web.Script.Serialization; using System.Xml.Linq; class Program { static void Main() { var xml = @"<Columns> <Column Name=""key1"" DataType=""Boolean"">True</Column> <Column Name=""key2"" DataType=""String"">Hello World</Column> <Column Name=""key3"" DataType=""Integer"">999</Column> </Columns>"; var dic = XDocument .Parse(xml) .Descendants("Column") .ToDictionary( c => c.Attribute("Name").Value, c => c.Value ); var json = new JavaScriptSerializer().Serialize(dic); Console.WriteLine(json); } } |
其输出结果为:{"key1":"True","key2":"Hello World","key3":"999"} 可能还会有更多的方法,这里不一一列出了。那么如何使用原生的C#代码将XML转换成JSON格式字符串呢?或者说该C#代码在较低版本的.NET Framework中也可以运行呢?来看看下面的介绍吧。 Introduction JSON是一个轻量级的数据交换格式,它可以非常容易地被页面的JavaScript编码为对象的形式,从而方便数据操作。 基于AJAX的页面使用XmlHttpRequest对象从服务端接收数据来响应用户的请求,当返回的数据是XML格式时,它可以被转换为JSON格式的字符串从而通过JavaScript更加容易地对数据进行处理。 许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理。要实现这一点,它们必须将XML格式转换为JSON格式。下面的ASP.NET C#代码实现了这一过程。 Code Description 代码中提供了一个方法XmlToJSON,可以用来将XmlDocument对象转换为JSON字符串。代码通过迭代每一个XML节点、属性以及子节点,来创建对应的JSON对象。 代码不会生成数字和布尔类型的值 Xml DocumentElement对象始终会被转换为JSON对象的member:object,它遵循下面这些规则。 节点的属性会被对应地转换为JSON对象的成员"attr_name":"attr_value"。如: XML JSON <xx yy=’nn'></xx> { "xx" : { "yy" : "nn" } } <xx yy="></xx> { "xx" : { "yy" : "" } } 没有子节点、属性和内容的节点被转换为成员"child_name":null XML JSON <xx/> { "xx" : null } 没有子节点和属性,但是有内容的节点被转换为成员"child_name":"child_text" XML JSON <xx>yyy</xx> { "xx" : "yyy" } 其它节点和属性会被适当地转换为"child_name":对象或者"child_name":[elements]对象数组,节点的值会被转换为对象成员的"value",如: XML JSON <xx yy=’nn'><mm>zzz</mm></xx> { "xx" : { "yy" : "nn", "mm" : "zzz" […]
View Details一、XML和JSON字符串的对应表格 1、节点的属性会被对应地转换为JSON对象的成员"attr_name":"attr_value"。如: XML JSON <xx yy=’nn'></xx> { "xx" : { "yy" : "nn" } } <xx yy="></xx> { "xx" : { "yy" : "" } } 2、没有子节点、属性和内容的节点被转换为成员"child_name":null XML JSON <xx/> { "xx" : null } 3、没有子节点和属性,但是有内容的节点被转换为成员"child_name":"child_text" XML JSON <xx>yyy</xx> { "xx" : "yyy" } 4、其它节点和属性会被适当地转换为"child_name":对象或者"child_name":[elements]对象数组,节点的值会被转换为对象成员的"value",如: XML JSON <xx yy=’nn'><mm>zzz</mm></xx> { "xx" : { "yy" : "nn", "mm" : "zzz" } } <xx yy=’nn'><mm>zzz</mm><mm>aaa</mm></xx> { "xx" : { "yy" : "nn", "mm" : [ "zzz", "aaa" ] } } <xx><mm>zzz</mm>some text</xx> […]
View Details