TFS二次开发、C#知识点、SQL知识总结目录

 

TFS二次开发系列

  TFS二次开发系列:一、TFS体系结构和概念

  TFS二次开发系列:二、TFS的安装

  TFS二次开发系列:三、TFS二次开发的第一个实例

  TFS二次开发系列:四、TFS二次开发WorkItem添加和修改、保存

  TFS二次开发系列:五、工作项查询

  TFS二次开发系列:六、TFS的版本控制

C#知识总结

C#中Hashtable、Dictionary详解以及写入和读取对比

  C#中IDisposable和IEnumerable、IEnumerator

  C#中Delegate和Event以及它们的区别

SQL知识总结

  SQL知识整理一:触发器、存储过程、表变量、临时表

  SQL知识整理二:锁、游标、索引

  SQL知识整理三:变量、全局变量、视图、事务、异常

扫盲Linq知识

 

LINQ,语言集成查询(Language Integrated Query),是在.NET Framework 3.5 中出现的技术。

借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据。从技术角度而言,LINQ定义了大约40个查询操作符,如from, select, in, where, group by, orderby, … 使用这些操作符可以编写查询语句。

做软件的,总想代码要怎么样才能更好地复用,要怎么样才更利于扩展,要怎么样更能以不变应万变。就如同微软框架所提供的API一样,在一定程度上避免开发者重复造轮子。拿LINQ来说吧,.NET Framework3.5及之后的版本都已经封装进去,供成千上百万的开发者使用。同一套LINQ语法,它能支持LINQ TO OBJECCT、LINQ TO XML、LINQ TO DATABASE。复用、减少开发工作量及降低学习成本等好处都是不言而喻的。LINQ的学习很像SQL,所以有使用过SQL语句的话,感觉还是蛮熟悉的。

上手简单是学习LINQ的一大好处,语法很像SQL语句的语法。而且学一种技术,可以当多种技术来使用。这是不是很像那种多功能刀,一刀在手,生活无忧。LINQ支持集合、XML、数据库的查询。写代码就像说话,多必失,所以呢,尽量优化自己的代码。这不但有利于减少错误的发生,也有利于提高生产率、降低维护的成本。而使用LINQ也是奔着这个方向发展。

坦白说,我看到网上有很多LINQ方面的教程,知识面介绍都挺好。我只能是厚着脸皮,站在巨人的肩膀上驰骋。本文基本是源于博友08年的文章,感觉他写的很好。虽然抄袭是很可耻的行为,但是回想大学能顺利毕业,论文也是东抄一块,西抄一块。所以现在我是很“蛋定”了。我要响应鲁老爷的拿来主义精神。

LINQ是一种查询语言,所以呢,运用的场景当然也就是查询罗。查哪些,包括LINQ TO OBJECCT、LINQ TO XML、LINQ TO DATABASE。可以说查询的范围很广。每一种都可以出一系列的文章,我们这里主要还是讲 LINQ TO OBJECCT。

来看看从集合中,我们是怎么来查询需要的值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqApplication
{
    class People
    {
        /// <summary>
        /// 名字
        /// </summary>
        public string FirstName { get; set; }
        /// <summary>
        /// 姓氏
        /// </summary>
        public string LastName { get; set; }
        /// <summary>
        /// 国家
        /// </summary>
        public string Country { get; set; }
    }

class Program
    {
        static void Main(string[] args)
        {

List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };
            List<People> result = new List<People>();

foreach (People p in listPeople)
            {
                if (p.Country == "China")
                {
                    result.Add(p);

}
            }

foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }
    }
}

上面的方法可以说是最直接,最容易想到的方法。上面的实现怎么看也没有觉得有什么好复用的,但是事实是怎么样?就有牛人看出了名堂,善于归纳上面的问题就是判断是跟不是的问题,就想到要去提出来,供以后复用。 当然复用之路也不是一蹴而就的,也是日积月累而成。所以我们也来看看过渡的过程。

/// <summary>
        /// 判断是否存在
        /// </summary>
        /// <param name="p">对象</param>
        public static bool IsExist(People p)
        {
            return p.Country == "China";
        }

如果说只是如下方式来实现的话,那还真是白费力气了。

foreach (People p in listPeople)
            {
                if (IsExist(p))
                {
                    result.Add(p);
                }
            }

但是结合到委托的话,我们就可以把IsExist(People p)当成一个参数来进行传递。这里我们过渡再快一点,我们把查询的那一段代码提到另一类Helper供以后得用。我们来看看Helper类的代码实现。限于篇幅的问题,只截Helper类的方法。

public class Helper
    {
        //声明委托
        public delegate bool ExistPeople(People p);

/// <summary>
        /// 获取满足条件的数据
        /// </summary>
        /// <param name="listPeople">数据集</param>
        /// <param name="existPeople">条件</param>
        public static List<People> GetPeopleResult(IList<People> listPeople, ExistPeople existPeople)
        {
            List<People> result = new List<People>();
            foreach (People p in listPeople)
            {
                if (existPeople(p))
                {
                    result.Add(p);
                }
            }
            return result;
        }
    }

这样我们就可以直接调用,来获取满足条件的数据了。也可以使用C#2.0提供的匿名委托,还可以使用C#3.0的Lambda表述式。代码如下:

static void Main(string[] args)
        {
            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };

IList<People> result = new List<People>();

//直接调用
            result = Helper.GetPeopleResult(listPeople, IsExist);
            //匿名委托
            //result = Helper.GetPeopleResult(listPeople, delegate(People p){ return p.Country == "China" ? true : false;});
            //Lambda表达式
            //result = Helper.GetPeopleResult(listPeople, people => people.Country == "China");

foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }

讲到这里,对于具体集合的查询基本上是完成了,但是呢,C#3.0还提供了一种方法,使调用的代码更加直观,那就是扩展方法。通过扩展IList集合的方法,我们就可以通过IList来调用并传递委托条件即可。

Helper类的扩展代码如下:

public static class Helper
    {
        //声明委托
        public delegate bool ExistPeople(People p);

/// <summary>
        /// 获取满足条件的数据
        /// </summary>
        /// <param name="listPeople">数据集</param>
        /// <param name="existPeople">条件</param>
        public static IList<People> GetPeopleResult(this IList<People> listPeople, ExistPeople existPeople)
        {
            List<People> result = new List<People>();
            foreach (People p in listPeople)
            {
                if (existPeople(p))
                {
                    result.Add(p);
                }
            }
            return result;
        }
    }

我们看Main方法的调用,是不是很直观了,就像调用集合的方法,并给传递委托条件即可了。Main方法如下:

static void Main(string[] args)
        {
            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };

IList<People> result = new List<People>();

//直接调用
            //result = Helper.GetPeopleResult(listPeople, IsExist);
            //匿名委托
            //result = Helper.GetPeopleResult(listPeople, delegate(People p){ return p.Country == "China" ? true : false;});
            //Lambda表达式
            //result = Helper.GetPeopleResult(listPeople, people => people.Country == "China");
            //扩展方法调用
            result = listPeople.GetPeopleResult(people => people.Country == "China");

foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }

上面是使用GetPeopleResult方法名,但是我们想要的话,是不是就可以实现诸如Select、Where、OrderBy等方法了。基本上方法的介绍就已经完了。但是有一个大的问题,那就是它还比较死,不灵活,因为我们不可能说每个集合里面的对象(本文是People)都重复来写。这里肯定是需要提供一种方式,使它能够接受不同的对象,这样才有利于我们复用。因为IList继承自IEnumerable,所以可以给IEnumerable实现扩展方法,然后利用泛型的特征,就可以给不同的对象来复用,代码如下:

public static class Helper
    {
        public delegate bool Condtion<T>(T t);
        public static IEnumerable<T> GetPeopleResult<T>(this  IEnumerable<T> items, Condtion<T> condition)
        {
            foreach (T t in items)
            {
                if (condition(t))
                {
                    //C# 2.0里出现的一个关键字,返回一个迭代器
                    yield return t;
                }
            }
        }
    }

Main方法就不贴全部了,毕竟上面都重复好几回,只贴调用那一句:

IEnumerable<People> result = Helper.GetPeopleResult<People>(listPeople, people => people.Country == "China");

而C# 3.0则给我们提供var关键字,被称为推断类型 。
var 关键字能指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework 类库中定义的类型或任何表达式。所以上面的式子可以写成如下方式:

var result = Helper.GetPeopleResult<People>(listPeople, people => people.Country == "China");

到此本文就正式结束,站在前人的肩膀下感觉真好,很多成果就是可以拿来就用,乐哉乐哉!希望大伙一起好好学习,天天向上了。

 
 
标签: linq

TFS二次开发、C#知识点、SQL知识的更多相关文章

  1. TFS二次开发、C#知识点、SQL知识总结目录

    TFS二次开发系列 TFS二次开发系列:一.TFS体系结构和概念 TFS二次开发系列:二.TFS的安装 TFS二次开发系列:三.TFS二次开发的第一个实例 TFS二次开发系列:四.TFS二次开发Wor ...

  2. TFS二次开发系列:七、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)

    在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一:连接TFS服务器,并且得到之后需要使用到的类方法. /// < ...

  3. TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)

    TFS二次开发的数据统计以PBI.Bug.Sprint等为例(一) 在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一 ...

  4. TFS二次开发系列:三、TFS二次开发的第一个实例

    首先我们需要认识TFS二次开发的两大获取服务对象的类. 他们分别为TfsConfigurationServer和TfsTeamProjectCollection,他们的不同点在于可以获取不同的TFS ...

  5. TFS二次开发系列索引

    TFS二次开发11——标签(Label) TFS二次开发10——分组(Group)和成员(Member) TFS二次开发09——查看文件历史(QueryHistory) TFS二次开发08——分支(B ...

  6. TFS二次开发02——连接TFS

    在上一篇<TFS二次开发01——TeamProjectsPicher>介绍了  TeamProjectsPicher 对象,使用该对象可以很简单的实现连接TFS. 但是如果我们要实现自定义 ...

  7. TFS二次开发-基线文件管理器(5)-源码文件的读取

      在上一节中,我们在保存标签之前,已经将勾选的文件路径保存到了Listbox中,这里只需要将保存的数据输出去为txt文档就可以做版本控制了.   版本文件比较复杂的是如何读取,也就是如何通过文件路径 ...

  8. TFS二次开发系列:五、工作项查询

    本节将讲述如何查询工作项,用于二次开发中定义获取工作项列表. 使用WorkItemStore.Query方法进行查询工作项,其使用的语法和SQL语法类似: Select [标题] from worki ...

  9. TFS二次开发系列:二、TFS的安装

    本系列的实例将采用TFS 2012+Sql Server2012编写. TFS的完整版本安装最好是在Windows server2008 64位以上版本中,其包括64位的SQL SERVER 2012 ...

随机推荐

  1. 实现双8bit数据指定的位置0要么1

    <pre name="code" class="cpp"> 方法一 #include<stdio.h> #include<math ...

  2. ACM之跳骚---ShinePans

    Description Z城市居住着非常多仅仅跳蚤.在Z城市周六生活频道有一个娱乐节目.一仅仅跳蚤将被请上一个高空钢丝的正中央.钢丝非常长,能够看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有 ...

  3. crawler_UE使用技巧

    UE使用技巧 Tip 1: 如何去掉所编辑文本中包含特定字符串的行? 这则技巧是在UltraEdit的帮助文件里提到.CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式&q ...

  4. ocp11g培训内部教材_053课堂笔记(043)_数据备份

    053:数据库高级管理: 目录 第一部分:数据库备份与恢复... 4 第一章:备份恢复概述... 4 1.1 备份的意义: 4 1.2 数据库故障的类型:... 4 1.3 制定你的备份和恢复的计划. ...

  5. 前端学习笔记(zepto或jquery)——对li标签的相关操作(三)

    对li标签的相关操作——八种方式遍历li标签并获取其值 $("ul>li").forEach(function(item,index){ alert(index+" ...

  6. 随记一个C的毫秒级群PING

    正好公司为了检测前台网络,力图收集有力证据与某CDN PK,所以随手写了一个群PING的程序. 写的内容比较简单,没有去特别追求线程效率,也没有去用LINUX 2.6+的殿堂级神器,以追求实现效率为主 ...

  7. Linux经常使用命令(一) - ls

    ls命令是linux下最经常使用的命令.ls命令就是list的缩写, 缺省下ls用来打印出当前文件夹的清单, 假设ls指定其它文件夹, 那么就会显示指定文件夹里的文件及文件夹清单. 通过ls 命令不仅 ...

  8. CRUD功能的JqGrid表格

    CRUD功能的JqGrid表格 之前的项目也曾用过JgGrid对它的基本功能也是略有了解,网上有个国外的开源的项目,但是不适合个人的风格,所以花了3天空余的时间封装了下JqGrid,也算是参加开发工作 ...

  9. Oracle查字符集查版本号

    原文:Oracle查字符集查版本号 ---查字符集 select * from nls_database_parameters ---查版本 查看oracle的版本信息 (1)用客户端连接到数据库,执 ...

  10. 快速构建Windows 8风格应用5-ListView数据控件

    原文:快速构建Windows 8风格应用5-ListView数据控件 本篇博文主要介绍什么是ListView数据控件.如何构建ListView数据控件. 什么是ListView数据控件? 1)  Li ...