韩迎龙

导航

公告

文章分类

随笔档案

最新评论

统计

常用链接

阅读排行榜

评论排行榜

置顶随笔 #

[置顶]在软件工程里面,我们知道这些知识点吗?我稍微整理了一下!

摘要: 软件:计算机运行所需要的各种程序和数据的总成,包括操作系统,汇编语言,编译,程序,数据库,文字编辑和维护使用手册等。软件的特性:(1)软件产品的主要生产是脑力劳动,还没有摆脱手工开发方式(2)软件是一种逻辑产品,他与物质产品不同,他是脑力劳动的结果(3)软件产品不会用坏(4)软件产品的生产主要是研制(5)软件费用不断增加,软件成本相当昂贵。软件的分类: 系统软件,应用软件软件的发展:程序设计时代(1946-1956),程序系统时代(1956-1968)软件工程时代(迄今)软件危机的表现 (1)对于软件开发的成本和进度的估计不太准确(2)开发的软件产品不能完全满足用户的需求(3)开发的软件的可靠阅读全文

posted @ 2011-12-10 21:29 韩迎龙 阅读(278) 评论(0) 编辑

[置顶]Window Phone开发未来发展趋势讲解

摘要: 众所周知,现在是互联网的时代,你身边的东西有多少是互联网的呢?比如你的手机,电脑,游戏机,那么现在就说未来是一个互联网的时代,你现在的手机是什么系统的呢?现在市面上最流行的手机移动互联网手机系统是“安卓”,“苹果系统”,还有微软的Window Phone 7系统,那么这三个手机系统的命运究竟会如何呢?微软的Windows Phone 系统作为后起之秀,他的发展究竟会如何呢,我现在就我的看法及我看的一些博客写出了这篇文章。借用传智播客杨老师(杨中科)的一句话:“牛人看未来,凡人看现在,当然我们大多数人是凡人,未来是互联网的时代,未来是什么样的呢?谁能看出来呢?”但是就我来说吧,我觉得未来微软的w阅读全文

posted @ 2011-12-09 17:06 韩迎龙 阅读(1973) 评论(16) 编辑

2012年5月25日 #

ASP.NET MVC+Spring.net+Nhibernate+EasyUI+Jquery开发案例(2)

摘要: 接着昨天的继续吧,我们的完美征程继续开始。昨天我们完成了MVC里面的Dao层的设计,在上面我们已经实现了操作数据库的代码,在这个项目中我实现了User_DepInfo表的增删改查和模糊查询,是基于EasyUI写的。第六步:实现Server的接口: NewKJ241.IBLL(1) 这个接口的作用和NewKJ241.IDao类库里面类的接口一模一样,目的是为了分层更加的明确,而且在后面还有一个类要继承自这个接口,在类库NewKJ241.IBLL下面新建一个类名,起名为:IUserDepInfoBLL,代码因为和上面那个接口的代码一模一样的,所以我就不写出来了。第七步:继承Server接口:New阅读全文

posted @ 2012-05-25 10:53 韩迎龙 阅读(1303) 评论(12) 编辑

2012年5月24日 #

ASP.NET MVC+Spring.net+Nhibernate+EasyUI+Jquery开发案例(1)

前言:由于这段时间公司的事情比较的繁忙,每天都要学习新的东西,所以好久没有写博客了,今天抽空写写博客来记录我这段时间研究的东西,给自己加深一下印象,我用easyUI的组件开发了一个简单操作数据库的小样例,一些常用的数据库操作都实现了,希望能和博客园里面的博主们交流交流意见。

首先我用的开发环境是Visual Studio 2010,ASP.NET MVC2.0,SQL SERVER2005,我用的NHibernate的版本是1.2.1,Spring.net的版本是1.1.0。

首先在这里将我的疑惑先说出来,希望有人能够给我解答解答,在这里谢过了,我在用版本的时候我发现NHibernate1.2.1和spring.net1.1.0(低版本)结合最好,Nhibernate3.0和spring.net 1.3.1(高版本)结合做好,不知道我的认为正确吗?但是低版本的话不能使用Nhibernate.Linq,只有Nhibernate3.0以上的版本支持Nhibernate,但是高版本的话我们项目里面有一个功能我们没有做出来,就是我们故意把数据库的连接字符串写错误,然后我执行不经过数据操作的页面的话,比如这个页面我就输出一句话,但是也会报错,说无法连接数据库,用户登录失败,但是我想要的是在没有操作数据库的页面可以正常显示,在操作数据库的页面在提示错误即可?不知道哪位博友有什么好方法呢?这种效果在低版本下面我可以实现了。

  1. 第一步:建立数据库

(1)    打开数据库SQL Server 2005,新建一个数据库bjk241,然后再此数据库中新建一张表,起名为:User_DepInfo,用来存放我们录入的数据,表的建立样式如下图所示:

 

  1. 第二步:建立项目,类库等

(1) 打开Visual Studio 2010集成开发环境,在Visual Studio 2010中建立一个ASP.MVC 2.0的项目,给项目其名称是NewKJ241,将会生成微软封装好的自带的MVC的整个架构结构,然后在项目里面建立几个类库,用来存放我在后面建立的一些项目,当我们建立完成之后如图所示:

 

(2) 当我们看到这张图的时候,我们是不是在疑惑这都是干什么的呢?不要着急,下面我就介绍一下各个项目和类库的作用。

  1) 首先我们看到了NewKJ241里面的内容和我们刚建立的不一样吧,那是因为我重新建立了几个文件夹,将没有的文件夹介绍一下,Configs文件夹里面放的是spring.net的XML节点,实现的作用是链接数据库和映射整个框架,下面我会详细介绍的,dlls文件夹里面放的是我们所要引用的dll,如图所示:

 

,easyUI文件夹里面是存放的是我们需要引用的easyUI的类库,其他的都是建立的时候自动生成的,后面会讨论的。

  2) NewKJ241.Model类库的作用是存放映射的数据库的文件。

  3) NewKJ241.IDao类库的作用是实现了我们所需要的在项目中实现数据库方法的接口。

  4) NewKJ241. NhibernateDao类库的作用是实现了IDao的接口,完成了接口所要实现的方法的代码。

  5)NewKJ241.IBLL类库的作用是实现了我们在项目中要使用Spring.NET所要使用的接口,和NewKJ241.IDao接口的写法一模一样。

  6)NewKJ241.BLL类库的方法是实现了Nhibernate的实现方法,继承自IBLL项目,是为了使用Spring.NET所写的方法。

下面我就讲我写的东西详细的讲述一下,有什么不足或者缺点我们可以讨论。

  1. 第三步:NHibernate映射文件

(1) 首先我们要映射出数据库中表的信息的文件,这里我们怎么映射呢,那么多的代码??别着急,我们可以用一个自动生成映射文件的组件CodeSmith软件,这个软件可以快速的帮助我们生成映射文件,关于这个软件怎么使用可以看我以前写的篇博客,那里详细的叙述了如何使用这个软件:http://www.cnblogs.com/hanyinglong/archive/2012/04/21/2462302.html

(2) 接下来我们在NewKJ241.Model里面建立一个文件夹Mappings,在这个文件夹里面我们存放了映射的文件,生成之后附加到项目中如图所示:

 

1)  UserDepInfo的作用是定义数据库中的字段,再用CodeSmith生成的时候模式字段属性是不加Virtual的,我们人为的给字段属性加上,代码如下:

        protected int _id;

        protected int _depID;

        protected string _depName;

        public UserDepInfo() { }

        public UserDepInfo(int depID, string depName)

        {

            this._depID = depID;

            this._depName = depName;

        }

        public virtual int Id

        {

            get { return _id; }

            set { _id = value; }

        }

        public virtual int DepID

        {

            get { return _depID; }

            set { _depID = value; }

        }

        public virtual string DepName

        {

            get { return _depName; }

            set

            {

                if (value != null && value.Length > 50)

                    throw new ArgumentOutOfRangeException("Invalid value for DepName", value, value.ToString());

                _depName = value;

            }

        }

2) 然后映射文件的代码如下:注意,在这里我们需要把这个XML文件改成嵌入的资源,不然后面我们事先不了功能,怎么改呢?很简单,右键——属性——生成操作改成嵌入的资源,这样就OK了,前期准备工作完成了下面我们就开始写方法了。在这里又看不懂是什么意思的,可以看我的博客:http://www.cnblogs.com/hanyinglong/archive/2012/04/20/2459314.html

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

                   assembly="NewKJ241.Model.UserDepInfo"

                   namespace="NewKJ241.Model.UserDepInfo">

  <class name="NewKJ241.Model.UserDepInfo,NewKJ241.Model" table="User_DepInfo" lazy="false">

    <!--下面是使用缓存所使用的一句话,但是本项目里面的二级缓存注释掉了,所以这里也注释-->

    <!--<cache usage="read-write"/>-->

    <!--部门表主键ID-->

    <id name="Id" type="Int32" unsaved-value="null">

      <column name="ID" length="4" sql-type="int" not-null="true" unique="true"/>

      <generator class="native" />

    </id>

    <!--部门表ID-->

    <property name="DepID" type="Int32">

      <column name="DepID" length="4" sql-type="int" not-null="false"/>

    </property>

    <!--部门表名称-->

    <property name="DepName" type="String">

      <column name="DepName" length="50" sql-type="varchar" not-null="false"/>

    </property>

  </class>

</hibernate-mapping>

  1. 第四步:建立Dao接口,实现操作数据库的方法

(1) 在NewKJ241.IDao类库下面新建一个类,起名为:IUserDepInfoDao,然后在此类中写要实现方法的接口,代码如下:

  //where表明了对类型变量T的约束关系,where T : class表示类型变量T是继承自class或者class本身

    public interface IUserDepInfoDao<T> where T : class

    {

        /// <summary>

        /// 获取实体

        /// </summary>

        /// <param name="id">主键</param>

        /// <returns>实体</returns>

        T Get(object id);

 

        /// <summary>

        /// 获取实体

        /// </summary>

        /// <param name="id">主键</param>

        /// <returns>实体</returns>

        T Load(object id);

 

        /// <summary>

        /// 插入实体

        /// </summary>

        /// <param name="entity">实体</param>

        /// <returns>插入的数据</returns>

        object Save(T entity);

 

        /// <summary>

        /// 修改实体

        /// </summary>

        /// <param name="entity">实体数据</param>

        void Update(T entity);

 

        /// <summary>

        /// 保存或者修改实体

        /// </summary>

        /// <param name="entity">实体数据</param>

        void SaveOrUpdate(T entity);

 

        /// <summary>

        /// 删除实体

        /// </summary>

        /// <param name="id">主键ID</param>

        void Delete(object id);

 

        /// <summary>

        /// 删除实体

        /// </summary>

        /// <param name="odList">主键ID的集合,删除多个项</param>

        void Delete(string idList);

 

        /// <summary>

        ///读取如果用户不输入任何信息进行查询的方法

        /// </summary>

        /// <param name="sort">按照某个字段进行排序</param>

        /// <param name="order">按照某个字段进行排序</param>

        /// <returns></returns>

        IList<UserDepInfo> loadByAll(string sort, string order);

 

        /// <summary>

        /// 读取用户输入条件进行查询的方法

        /// </summary>

        /// <param name="sort">按照某个字段进行排序</param>

        /// <param name="order">按照某个字段进行排序</param>

        /// <param name="name">只用户输入的信息</param>

        /// <returns></returns>

        IList<UserDepInfo> loadAllCheck(string sort, string order, string name);

 

        /// <summary>

        ///

        /// </summary>

        /// <param name="total">总的数量</param>

        /// <param name="page">当前的页数</param>

        /// <param name="rows">每页所显示的数量</param>

        /// <param name="order">按照某个字段进行排序</param>

        /// <param name="sort">按照某个字段进行排序</param>

        /// <param name="DepName">只用户输入的信息</param>

        /// <returns></returns>

        IList<UserDepInfo> LoadAllByPage(out long total, int page, int rows, string order, string sort, string DepName);

}

这里就没什么说的了,写法都很固定!!

  1. 第五步:建立NhibernateDao项目,实现IDao接口的方法

(1) 在NewKJ241.Nhibernate类库下面建立类,起名为:UserDepInfoDao,在该方法中继承自IDao接口,实现了IDAO接口里面的所有方法,在书写本代码的时候,我们必须引入dll,引入的dll如图所示:

 

代码如下:

 public class UserDepInfoDao<T> : HibernateDaoSupport, IUserDepInfoDao<T> where T : class

    {

        public T Get(object id)

        {

            return this.HibernateTemplate.Get<T>(id);

        }

 

        public T Load(object id)

        {

            return this.HibernateTemplate.Load<T>(id);

        }

 

        public virtual object Save(T entity)

        {

            return this.HibernateTemplate.Save(entity);

        }

 

        public void Update(T entity)

        {

            this.HibernateTemplate.Update(entity);

        }

 

        public void SaveOrUpdate(T entity)

        {

            this.HibernateTemplate.SaveOrUpdate(entity);

        }

 

        public void Delete(object id)

        {

            var entity = this.HibernateTemplate.Get<T>(id);

            if (entity == null)

            {

                return;

            }

            else

            {

                this.HibernateTemplate.Delete(entity);

            }

        }

 

        public void Delete(string idList)

        {

            string[] idl = idList.Split(',');

            int len = idl.Length;

            for (int i = 0; i < len; i++)

            {

                var entity = this.HibernateTemplate.Get<T>(int.Parse(idl[i].ToString()));

                if (entity == null)

                {

                    return;

                }

                else

                {

                    this.HibernateTemplate.Delete(entity);

                }

            }

        }

 

        public IList<UserDepInfo> loadByAll(string sort, string order)

        {

            string hql = "from UserDepInfo order by " + sort + " " + order;

            return this.HibernateTemplate.Find<UserDepInfo>(hql).ToList();

 

        }

 

        public IList<UserDepInfo> loadAllCheck(string sort, string order, string name)

        {

            string hql = "from UserDepInfo where DepName like ? order by " + sort + " " + order;

            return this.HibernateTemplate.Find<UserDepInfo>(hql, new object[] { "%" + name + "%" }).ToList();

        }

 

 

        public IList<UserDepInfo> LoadAllByPage(out long total, int page, int rows, string order, string sort, string DepName)

        {

            IList<UserDepInfo> list = null;

            if (DepName == null)

            {

                list = this.loadByAll(sort, order);

            }

            else

            {

                list = this.loadAllCheck(sort, order, DepName);

            }

            total = list.LongCount();

            list = list.Skip((page - 1) * rows).Take(rows).ToList();

            return list;

        }

}

哎,工作一天了,累了,回学校了,明天继续,今天写的这些都是基础,后面还会在写这个项目的,一直到这个项目写完!!,也是最有知识点了,所谓学习吗,一步一个脚印,慢慢来吧!!!

posted @ 2012-05-24 19:54 韩迎龙 阅读(1523) 评论(12) 编辑

2012年5月19日 #

JavaScript学习笔记记录我的旅程

  1. 什么是JavaScript?

(1) HTML只是描述网页长相的标记语言,没有计算,判断能力,如果所有计算,判断(比如判断文本框是否为空,判断两次密码是否输入一致)店铺放到服务器端执行的话网页的页面会非常的慢,用起来也很难用,对服务器的压力也很大,因此要求能在浏览器中执行一些简单的运算,判断,JavaScript就是一种在浏览器端执行的语言。

(2) JavaScript和Java没有直接的关系,唯一的关系就是JavaScript原名LiveScript,后来吸取了Java的一些特性,升级为JavaScript,JavaScript有时被简称为JS。

(3) JavaScript是解释性语言,无需编译就可以随时执行,这样哪怕语法有错误,没有语法错误的部分还是能够正确的执行。

  1. JS的开发环境

(1) VS中JavaScript,Jqery的自动完成功能。

(2) JS是非常灵活的动态语言,不像C#等静态语言那样严谨。

  1. JS入门

(1)  <script type="text/javascript">

          alert(new Date().toLocaleDateString());

        </script>

(2) JavaScript代码放到<script>标签中,<script>可以放到<head>,<body>等任意位置,而且可以有不止一个<script>标签。alert函数是弹出消息窗口,new Date()是创建一个Date类的对象,默认值就是当前的时间。

(3) 放到<head>中的<script>在body加载之前就已经运行了,写在body中的<script>是随着页面的加载而一个个的执行的。

(4) 除了可以再页面中声明JavaScript之外,还可以将JavaScript写在单独的JS文件中,然后在页面中引入:<script src=”common.js” type=”text/javascript”></script>。声明到单独的JS文件的好处是多页面也可以共享,减少网络流量。

  1. 事件

(1) <a href="javascript:alert('Hello')">点击我</a>

       <a href="javascript:void(0)">我就不弹出东西</a><br />

     <a href="JSoop.htm" onclick="alert('您确认你要跳转吗?')">单击我</a>

(2) JavaScript中也有事件的概念,当按钮被点击的时候

        1) <input type="button" value="单击我" onclick="alert('终于单击我了')" />

 2) 只有超链接的href中的JavaScript中才需要”JavaScript:”,因为他不是事件,而是把”JavaScript:’看成像”http:”,”ftp:”,”thunder://”,ed2k://,mailto://一样的网络协议,交由JS解析引擎处理,只有href中这一个特列。

  1. JS变量

(1) JavaScript中既可以使用双引号声明字符串,也可以使用单引号声明字符串,主要是方便和HTML集成,避免转义符的麻烦。

(2) var i=10;  //声明一个变量,名字为i,指向10这个整数,一旦指向10,i就是int类型,  alert(i);

(3) JavaScript中有null,underfined两种,null表示变量的值为空,underfined则表示变量还没有指向任何的对象,未初始化。

(4) JavaScript是弱类型,表示变量的时候无法:int i=10.只能通过var i=10;声明变量,和C#中的var不一样,不是C#中的那样的类型推断。

(5) JavaScript中也可以不用var声明变量,直接用,这样的变量是”全局变量”,因此除非确实想用全局变量,否则使用的时候最好加上var。

(6) JS是动态类型的,因此var i=10;i=”abc”是合法的。

  1. JavaScript

(1)    var sum = 0;

        for (var i = 0; i <= 100; i++) {

            sum = sum + i;

        }

        alert(sum);

(2) 如果JavaScript中的代码有语法错误,浏览器会弹出报错信息,查看报错信息就能帮助排查错误。

(3) JavaScript的调试,使用VS可以很方便的进行JavaScript的调试,调试时需要注意几点:

 1) IE的调试选项要打开,Internet选项-高级,去掉”禁用脚本调试”前的勾选。

 2) 以调试方式运行界面。

 3) 设置断点,监视变量等操作和C#一样。

  1. 判断变量初始化

(1) JavaScript中判断变量,参数是否初始化的三种方法。

var r;             

 if (r == null) {       if (typeof (r) == "undefined") {     if (!x) {

            alert("null");              alert("undefined");                alert("不X");

        }                  }                             }

注:推荐用最后一种方法

  1. 函数的声明

(1) JavaScript中声明函数的方法:

function Add(i1, i2) {

            return i1 + i2;

        }

(2) 不需要声明返回值类型,参数类型,函数定义以function开头

var r = Add(10, 20);

        alert(r);

        var r = Add("tom,", "您好");

        alert(r);

(3) JavaScript中不像C#中那样要求所有路径都有返回值。

  1. 匿名函数

(1)     var f1 = function sum(i1, i2) {

            return i1 + i2;

        }

        alert(f1(10, 20));

(2) 类似于C#中的匿名函数。

(3) 这种匿名的用法在Jquery中用法特别多。

(4)     alert(function sum(i1, i2) {

            return i1 + i2;

        } (100, 10));  

注解:C#中匿名函数使用委托来调用。

  1. JS面向对象基础

(1) JavaScript中没有类的语法,是用函数闭包(closure)模拟出来的,下面讲解的时候还是用C#中的类,构造函数等概念,JavaScript中string,date等”类”都被叫做”对象”,JavaScript中声明类(类不是类,是对象)。

(2)    function Person(name, age) {   //声明一个函数,当成类用

            this.Name = name;

            this.Age = age;

            this.SayHello = function () {

                alert("你好,我是" + this.Name + ",我今年:" + this.Age + "岁了");

            }

        }

        var p1 = new Person("韩迎龙", "23");

        p1.SayHello();

(3) 必须要声明类名,function Person(name,age)可以看做是声明构造函数,Name,Age这些属性也是使用者动态添加了。

  1. Array()对象

(1) JavaScript中的Array对象就是数组,首先是一个动态数组,而且是一个像C#中数组ArrayList,Hashtable等的超强综合体。

(2)         var names = new Array();

        names[0] = "韩迎龙";

        names[1] = "得到";

        names[2] = "说的";

        for (var i = 0; i < names.length; i++) {

            alert(names[i]);

        }

(3) 无需预先制定大小,动态。

  1. Array()练习1

(1) Array练习,求出一个数组中的最大值。

    <script type="text/javascript">

        function MyMax(arr) {

            var max = arr[0];

            for (var i = 0; i < arr.length; i++) {

                if (arr[i] > max) {

                    max = arr[i];

                }    }

            return max;

        }

        var arr = new Array();

        arr[0] = 20;

        arr[1] = 10;

        arr[2] = 34;

        alert(MyMax(arr));

    </script>

  1. Array()练习2

(1) 将一个字符串数组的元素的顺序进行反转,{3,9,5,34,54}{54,34.5.9.3}。不要使用JavaScript中的反转函数,提示:第i个和第length-i-1进行交换,定义函数。

<script type="text/javascript">

        function MyReverse(arr) {

            for (var i = 0; i < arr.length / 2; i++) {

                var temp = arr[i];

                arr[i] = arr[arr.length - i - 1];

                arr[arr.length - i - 1] = temp;

            }

        }

        var arr = new Array();

        arr[0] = "3";

        arr[1] = "9";

        arr[2] = "5";

        arr[3] = "34";

        arr[4] = "54";

        alert(arr);

        MyReverse(arr);

        alert(arr);

  1. Array()练习3

(1) 将一个字符串数组输出为|分割的形式,比如:韩迎龙|试试|订单。不要使用JavaScript中的Join函数,arr.join(1)将数组用分割符链接成一个字符串。

<script type="text/javascript">

        function MyJoin(arr) {

            if (arr.length <= 0) {

                return;

            }

            var s = arr[0];

            for (var i = 1; i < arr.length; i++) {

                s = s + "|" + arr[i];

            }

            return s;

        }

        var arr = new Array();

        arr[0] = "韩迎龙";

        arr[1] = "试试";

        arr[2] = "订单";

        alert(MyJoin(arr));

        //第二种方法

        alert(arr.join("|"));

    </script>

  1. Array的字典用法

(1) JS中的Array是一个宝贝,不仅是一个数组,还是一个Dictionary,还是一个Stack。

(2)    var names = new Array();

        names["人"] = "ren";

        names["扣"] = "kou";

        names["手"] = "shou";

        alert(names["人"]);

        alert(names.人);

        for (var k in names) {

            alert(k);

        }

(3) 像Hashtable,Dictionary那样用,而且像他们一样的效率高。

  1. Array()的简化声明

(1) Array还可以有简化的方式

var arr=[3,4,5,6,7];  //普通数组初始化

这种数组可以看做是names[“人”]=”ren”;的特例,也就是key为0,1,2,3,4,5

(2) 字典风格的简化创建方式

 var arr={”tom”=30,”jim=”30};

  1. 数组,for和其它

(1) 对于数组风格的Array来说,可以使用join方法拼接为字符串。

        var arr = ["tom", "jim", "kencery"];

        alert(arr.join(","));  //JS中join是array的方法,不像.net中是string的方法

(2) for循环可以像C#中的foreach一样的使用。

        for (var e in document) {

            alert(e);

        }

posted @ 2012-05-19 21:29 韩迎龙 阅读(1040) 评论(0) 编辑

2012年5月16日 #

LINQ学习(扩展方法,委托,Lambda表达式) 第二篇

  1. LINQ基本查询操作符-获取数据

(1) select()  语法是:

public static IEnumerable<TResult> select<TSource,TResult>(

   this IEnumerbale<TSource> source.

Func<TSource,TResult> selector)

说明:1) select方法本身是一个泛型扩展方法

 2) 它作用于IEnumerable<TSource>类型

 3) 他只接受一个Func<TSource,TResult>类型参数

 4) Func<TSource,TResult>是一个泛型委托,位于System名字的空间下,System.Core.dll中,在这里Selector是一个提取器。

 (2) 举例说明,先定义一个静态类ExtraClass,然后再静态类中在定义一个静态的扩展方法,实现输出信息。代码如下:

public static class ExtraClass

    {

        //为IEnumerable提供输出的方法

        public static void Print(this IEnumerable<string> ie)

        {

            IEnumerator<string> result = ie.GetEnumerator();

            while (result.MoveNext())

            {

                MessageBox.Show(result.Current);

            }

        }

}

然后如图所示,单击图上的按钮事件,在按钮事件中的代码是:

 

此事件下面的代码实现了将一个泛型集合中的数据循环显示出来,代码如下:

List<string> persons = new List<string>();

    persons.Add("zhang san");

    persons.Add("zhang san feng");

    persons.Add("li si");

    persons.Add("wang wu");

    persons.Add("wang liu");

    persons.Add("li ba");

    persons.Add("lao wu");

    persons.Add("zhang xx");

    //输出persons里面的所有的元素

    var result = persons.Select(p => p);

result.Print();

执行结果是按顺序循环输出。

2. LINQ基本查询操作符-过滤数据

(1) where() 语法是:

  public static IEnumerable<TSource> where<TSource>(

      this IEnumerable<TSource> source,

Func<TSource,bool> predicate)

说明:1) where方法是一个泛型扩展方法

 2) 它和select()一样作用与IEnumerable<TSource>类型

 3) 它只接受一个Func<TSource,bool>泛型委托参数,在这里predicate是一个判断条件。

(2) 举例说明,还是上面的例子,使用那个泛型集合,实现按照一定的条件输出信息。先创建一个方法,实现输出姓“zhang”的人的信息,代码如下:

public bool Judge(string s)

        {

            if (s.StartsWith("zhang"))

            {

                return true;

            }

            return false;

        }

  在select控件的事件下面用LINQ代码输出只是姓张的各种各样的实现代码:

//输出persons里面姓“zhang”的人

     //var result = persons.Where(p => p.StartsWith("zhang"));  //第一种方法

     //var result = persons.Select(p => p).Where(p => p.StartsWith("zhang")); //第二种方法

     //var result = persons.Where(p => p.StartsWith("zhang")).Select(p => p);  //第三种方法

     var result = persons.Where(p => Judge(p));   //第四种方法

     result.Print();

3. LINQ基本查询操作符-排序数据

(1) OrderBy()  语法是:

  pblic static IOrderedEnumerable<TSource> orderBy<TSource,TKey>(

        this IEnumerable<TSource> source

       Func<TSource,TKey> keySelector)

注:1) orderBy方法也是一个泛型扩展方法

 2) 它和select()一样作用与IEnumerable<TSource>类型

 3) 它只接收一个Func<TSource,Tkey>类型参数,在这里keySelctor指定要排序的字段。

 4) 如果想要降序排列可以使用orderbyDescending方法。

(2) 举例说明,同上例,实现排序的代码如下:

//var result = persons.OrderBy(p => p);

       //按照名字的最后一个字母排序

       //var result = persons.OrderBy(p => p.Substring(p.Length - 1, 1)).Select(p => p);

       //降序排列

       var result = persons.OrderByDescending(p => p);

       result.Print();

  1. Linq基本查询操作符-分组数据

(1) GroupBy()  语法是:

   public static IEnumerable<IGrouping<Tkey,TSource>>

               GroupBy<TSource,TKey>(

                      this IEnumerable<TSource> source,

                      Func<TSource,TKey> keySelector  )

说明:1) GroupBy()方式和OrderBy()方式非常类似,它也是一个泛型扩展方法。

2) 它和OrderBy()一样作用与IEnumerable<TSource>类型。

3) 它只接受一个Func<TSource,TKey>类型参数,在这里keySelector指定要分组的字段。

(2) 举例说明,同上例,实现分组的代码是:

//分组---按照姓名来分组¦--取出姓名中的空格前的部分

     var result = persons.GroupBy(p => p.Split(new char[] { ' ' })[0]);

    foreach (var group in result)

    {

         Console.WriteLine("姓:" + group.Key);

         foreach (var name in group)

          {

               Console.WriteLine("\t" + name);

          }

          Console.WriteLine();

     }

  1. 查询执行的时机

(1) 从前面的试验中,我们发现一次查询实际上经过以下3步。

 1) 第一步:获取数据源  int[] numbers=new int[]{3,45,65,76,2,434,54,65,76,76,65,43};

  2) 第二步:定义查询  var even=numbers.Where(p=>p%2==0).Select(p=>{

Console.WriteLine(“Hi!”+p.ToString());

return p;     });

  3) 第三步:执行查询   foreach(var item in even){   }

  1. 查询执行的时机小节

(1) 查询分为以下三步,获取数据源,定义查询,执行查询

(2) 定义查询后,查询直到需要枚举结果时才被真正执行,这种方法称为”延迟执行”。

(3) 当查询结果返回单一值时,查询立即执行。举例,如代码:

         //查询时机---当返回值为单值时马上执行语句,负责延迟执行

      var result = persons.Select(p => p).Count();

      Console.WriteLine("个数是" + result);

(4) 因此,可以通过以下技巧在定义查询时就强制执行查询

  1. Linq查询的两种方式

(1) Method syntax,查询方法方式

  主要利用System.Linq.Enumerable类中定义的扩展方法和Lambda表达式方式进行查询。

(2) Query syntax ,查询语句方式

  1. 查询语句VS查询方法

注:查询语句和查询方法存在着紧密的关系

(1) CLR本身并不理解查询语句,它只理解查询方法。

(2) 编译器负责在编译时将查询语句翻译为查询方法。

(3) 大部分查询方法都有对应的查询语句形式,如:Select()对应select,OrderBy()对应orderby。

(4)部分查询方法目前在C#中还没有对应的查询语句:如:Count()和Max()这时只能采用以下替代方案

  1) 查询方法

  2) 查询语句+查询方法的混合方式

(5) 一般情况下,建议使用可读性更好的查询语句。举例说明:

还是用上面多定义的泛型集合数组persons,用查询语句实现几个简单的功能,代码如下:

//输出persons中的所有的元素

var result = from p in persons select p;

    //输出persons中姓zhang的人----语句和方法的混合编排?

     var result = (from p in persons select p).Where(p => p.StartsWith("zhang"));

     //排序

      var result = from p in persons orderby p select p;

      result.Print();

  1. 高级查询方法

(1) 聚合类  Count(),Max()/Min(),Average(),Sum()。举例说明:

 重新定义一个数组来实现上面的各种各样的方法,代码如下:

   //LINQ to Objects查询高级方法

      //数组数据arr

      int[] arr = { 23, 34, 5, 5, 23, 45, 65, 33, 43, 76, 67, 87 };

      //聚合类

      Console.WriteLine("arr的最大值: + arr.Max());

      Console.WriteLine("arr的最小值¦: " + arr.Min());

      Console.WriteLine("arr的平均值¦: " + arr.Average());

      Console.WriteLine("arr的数组元素个是" + arr.Count());

      Console.WriteLine("arr的总和是: " + arr.Sum());

(2) 排序类  thenBy()  代码如下:

      //排序类

      var result = arr.OrderBy(p => p.ToString().Substring(0, 1));

      //2次排序混编模式没有达到要求

      var result = arr.OrderBy(p => p.ToString().Substring(0, 1)).ThenBy(p => p);

      //按照语句排序

      var t = arr.OrderBy(p => p.ToString().Substring(0, 1));

      var result = from p in t orderby p descending select p;

(3) 分区类  Take,TakeWhile,Skip,SkipWhile   代码如下:

      //分区类

      var result = arr.Skip(3).Take(3);  //跳过三个值取三个值

      var result = arr.Skip(3);  //跳过几个值

var result = arr.SkipWhile(p => p > 4); //方法体部分是该Linq语句不在往后执行的条件,当第一次遇到条件成立时,取剩下的所有元素

      var result = arr.TakeWhile(p => p > 4); //方法体部分是该Linq语句提取数据的条件,当第一次遇到条件不成立的情况就停止执行

(4) 集合类   Distinct   代码如下:

      //集合类

      var result = arr.Distinct();

(5) 生成类   Range,Repeat   代码如下:

      //生成类-----静态类

       var result = System.Linq.Enumerable.Range(10, 50);

       var result = System.Linq.Enumerable.Range('a', 50); //生成连续的序列

       var result = System.Linq.Enumerable.Repeat(40, 10);

       result.Print();

  1. 生成类查询方法小结

注:使用生成类查询方法时,需要注意以下几点:

(1) 和其它几类方法不同,Range/Repeat不是扩展方法,而是普通的静态方法

(2) Range只能产生整数序列。

(3) Repeat可以产生泛型序列。

(4) 所有的查询方法都存放在System.Linq.Enumerable静态类中。

posted @ 2012-05-16 21:29 韩迎龙 阅读(1173) 评论(1) 编辑

2012年4月21日 #

快速生成NHibernate的映射文件和映射类的利器 —— codesmith软件

摘要: 1. Codesmith软件简介(1) Codesmith软件是一种基于模板的代码生成工具,在ORM中,它能帮助我们生成实体类、XML配置文件,从而简化了我们一部分的开发工作,它的使用类似于ASP.NET的语法来生成任意类型的代码和文本,使用Codesmith可以生成包括简单的强类型集合和完整应用程序在内的任何东西。(2) 当我们用ASP.NET开发网站或者项目生成应用程序的时候,我们经常需要完成一些重复性的任务,例如:编写数据访问代码或者生成自定义集合,Codesmith在这个时候特别的有用,因为我们可以编写模板自动完成这些任务,从而可以提高我们的工作效率。(3) 下面我将以自动生成NHib阅读全文

posted @ 2012-04-21 20:02 韩迎龙 阅读(1586) 评论(41) 编辑

2012年4月20日 #

NHibernte+ASP.NET MVC+JQuery实现增删改查

摘要: 前言:本人自学NHibernate+asp.net mvc+JQuery实现了一个简单的用户的增删改查的功能,现在做一个小的整理,希望和我一样正在自学这几个技术的人能够共同参考,共同进步,下面我将分为好几步做为项目的讲解。也是为了我能够更加的熟悉项目的编写。1. 第一步:建立数据库(1) 打开数据库SQL Server 2005,新建一个数据库NHibernate,然后再此数据库中新建一张表,起名为:Users,用来存放我们录入的数据,表的建立样式如下图所示:2. 第二步:建立项目,映射数据库(1) 打开Visual Studio 2010集成开发环境,在Visual Studio 2010中阅读全文

posted @ 2012-04-20 14:45 韩迎龙 阅读(2773) 评论(32) 编辑

2012年4月15日 #

黑马程序员—ASP.NET Socket网络编程

摘要: ---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------Socket相关概念(1) Socket的英文原义是“孔”或者“插座”,作为进程通信机制,取后一种意思,通常也称作“套接字”,用于藐视IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)。(2) Socket非常类似于电话插座,以一个电话网为例,电话的通话双方相当于相互通信的2个程序,电话号码就是IP地址,任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的电话号码,相当于对方有一个固定的So阅读全文

posted @ 2012-04-15 21:20 韩迎龙 阅读(304) 评论(1) 编辑

2012年4月12日 #

黑马程序员—多线程的总体概括和总结

摘要: ---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------为什么要用多线程(1) 让计算机”同时”做很多事情,节约时间。(2) 后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。(3) 多线程可以让一个程序来“同时”处理多个事情。(4) 计算机CPU大部分时间处于空闲状态,浪费了CPU资源。进程与线程(图示说明)(1) 一个进程至少有一个线程(2) 同一个进程中的多个线程之间可以“并发执行”。(3) 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针,程序计数器等)阅读全文

posted @ 2012-04-12 19:26 韩迎龙 阅读(184) 评论(0) 编辑

2012年4月10日 #

LINQ学习(扩展方法,委托,Lambda表达式) 第一篇

摘要: 前言:从今天开始我将我将学习LINQ的一些知识点,所以我将我整理的笔记发布,以供和我一样在学习LINQ的人能够参考。我们的目的就是学好LINQ的基础,然后再基础上面我们能够更进一步的学习到LINQ的精华。LINQ是什么?(1) LINQ(Language Integrated Query)即语言集成查询。(2) LINQ主要包含以下三个部分 1) LINQ to Objects主要负责对象的查询2) LINQ to XML 主要负责XML的查询 3) LINQ to ADO.NET 主要负责数据库的查询u LINQ to SQLu LINQ to DataSetu LINQ to Entrti阅读全文

posted @ 2012-04-10 15:30 韩迎龙 阅读(320) 评论(0) 编辑

2012年4月9日 #

黑马程序员—SQL数据库开发知识总结:提高篇

摘要: ---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------联合结果集(1) 简单的结果集联合 select FNumber,FName,Fage from T_Employee\ union select FidCardNumber,FName,Fage from T_Employee(2) 查询的基本原则是:每个结果集必须有相同的列数,没个结果集的列必须类型相同。 select FNumber,FName,Fage,FDepartment from T_Employee union sele阅读全文

posted @ 2012-04-09 11:43 韩迎龙 阅读(282) 评论(1) 编辑

仅列出标题  下一页