LINQ 常用查询

来源:互联网 发布:lol显示网络连接失败 编辑:程序博客网 时间:2024/06/07 04:11

什么是LINQ?

集成查询语言

LINQ优点是什么?

1、可以对多种数据源和对象进行查询,如数据库、数据集、xml文档甚至是数组,这在传统的查询语句中是很难实现的。

2、和sql查询规则很相似,容易上手。

说明:

LINQ的全称:Language-Intergrated Query

命名空间:System.Linq;

Linq是.NET Framework3.5中出现的技术,所以在新建项目的时候必须选择3.5或更高版本。

选择3.5或更高版本.NET Framework3.5 之后创建类文件中就会自动包含System.Linq;的命名空间。

LINQ的基本格式:

var <变量>=from <项目> in <数据源> where <表达式> orderby <表达式>


1.数组

int[] inter={1,2,3,4,5,6,7,8,9};var stInt=from s in inter where s>5 select s;//stInt就是大于5的数据集合string[] str={"张三","李四","张小六","陈七","王五"};var stStr=from l in str where l.Contains("张") select l;//stStr就是名字中包含‘张’的集合。

2.sqlserver

首先应该先创建一个LINQ to SQL类文件(直接将服务器资源管理器中相应表拖放到LINQ to SQL类文件可视化窗口即可),创建好后就可以直接使用LINQ to SQL类文件提供的类进行查询。

linqtosqlDataContext lq = new linqtosqlDataContext();var mylq = from l in lq.Student from cl in lq.Class where l.C_id == cl.C_id select l;//查询Student表与Class表
3、数据集
SqlConnection con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'");//创建链接con.Open();//打开链接string strSql = "select  *  from student,class where student.C_id=class.C_id";//拼写sqlSqlDataAdapter da = new SqlDataAdapter(strSql,con);//创建适配器DataSet ds = new DataSet();//创建数据集da.Fill(ds,"myTable");//填充数据集DataTable tables = ds.Tables["myTable"];//创建表var dslq = from d in tables.AsEnumerable() select d;//执行linq语句// 注意:LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ查询,需要使用ASEnumerable方法返回一个泛型的对象以支持LINQ的查询操作。

---------------------------------------------------------------------------------------------------------------------------------

where子句

int[] inter={1,2,3,4,5,6,7,8,9};var stInt=from s in inter where s>5 select s;--stInt就是大于5的数据集合

group分组子句

返回元素类型为IGrouping<TKey,TElement>对象序列(分组签数据源必须支持分组操作才可使用group语句进行分组)

 public class Person    {        public int age;        public string name;        public int cid;        public Person(int age, string name, int cid)        {            this.age = age;            this.name = name;            this.cid = cid;        }    }
public class CarInformaion    {        public int cid;        public string type;        public CarInformaion(int cid, string type)        {            this.cid = cid;            this.type = type;        }    }


List<Person> personList = new List<Person>();personList.Add(new Person(11, "zhangsan",1));personList.Add(new Person(11, "lisi",2));personList.Add(new Person(16, "wangwu",1));personList.Add(new Person(12, "zhaoliu",3));personList.Add(new Person(16, "lala",3));
List<CarInformaion> listcar = new List<CarInformaion>();listcar.Add(new CarInformaion(1,"尼桑"));listcar.Add(new CarInformaion(2, "宝马"));listcar.Add(new CarInformaion(3, "奥迪"));

==================================================================================================

var gl = from p in personList group p by p.age;//根据age分组
注意:因为group子句返回的元素类型是IGrouping<TKey,TElement>的对象序列,所以在遍历时 必须在循环中嵌套一个对象的循环才能够查询相应的数据元素。
foreach(var element in gl){     foreach(Person p in element){      // p.name;   p.age;}}

orderby 排序子句

var gl = from p in personList orderby p.age select p;//默认是升序 ascending, 降序descending
var gl = from p in personList orderby p.age descending select p;//降序排列
var gl = from p in personList orderby p.age descending,p.name select p;//也可根据多个条件进行排序,条件之间用“,”分隔

into连接子句

into子句通常和group子句一起使用。通常情况不需要into子句。对分组中的元素进行操作的时候需要使用into子句。

into语句能够创建临时标识符,用于保存查询的集合

 var gl = from p in personList group p by p.age into x select x;//linq查询语句将查询的结果填充到了临时标识符对象x中,并返回查询集合给gl变量。

注意:into子句必须以select、group 等子句作为结束子句,否则会抛出异常。

join连接子句

注意:1.首先两个数据源必须要有一定的联系。

var res = from p in personList join car in listcar on p.cid equals car.cid select p;

let临时表达式子句

let可以说是一个临时的变量,用于保存表达式的结果,但是let子句指定的范围变量值,只能通过初始化进行赋值,一旦初始化之后就无法进行更改操作。

var gl = from p in personList let car = from c in listcar select c.cid select p;
let就相当于一个中转变量,用于临时存储表达式的值.如x=x+1、y=y+2....

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Linq与Lambda

先恶补一下lambda知识:----------------------------------------------------------------------------------------

C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:       
形参列表=>函数体
函数体多于一条语句的可用大括号括起。
可以将此表达式分配给委托类型,如下所示:
delegateintdel(inti);
del myDelegate = x => { returnx * x; };
intj = myDelegate(5); //j = 25

----------------------------------------------------------------------

LINQ常用操作Count计算集合中元素数量,或满足条件的集合的元素数量GroupBy实现对集合中的元素进行分组操作。Max获取集合中元素的最大值Min获取集合中元素的最小值Select执行投影操作SelectMany执行投影操作,可以对多个数据源进行投影操作Where执行筛选工作


select 选择子句

            int[] inter = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14};            var lint = inter.Select(i=>i);//select 映射            foreach(var m in lint){                m.ToString();            }
上述代码将集合中的元素进行投影,并将符合条件的元素投影到新的集合中lint

selectMany 多重选择子句

            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };    //创建数组            int[] inter2 = { 21, 22, 23, 24, 25, 26 };            List<int[]> list = new List<int[]>();            list.Add(inter);            list.Add(inter2);            var lint = list.Select(i => i);            foreach (var m in lint)            {                m.ToString();            }
上述代码将不同的数据源映射到一个新的集合中。

Where 筛选操作

 int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };    //创建数组 var lint = inter.Where(i=>i>5); foreach(var a in lint){     Console.WriteLine(a.ToString()); } // var lint = inter.Where(i=>i>5); 功能等同  var res = from l in inter where l > 5 select l;

orderBy
高级排序orderby根据关键字对集合中的元素按升序排列orderbydescending根据关键字对集合中的元素按降序排列thenby根据次要关键字,对集合中的元素进行升序排列thenbydescending根据次要关键字,对集合中的元素进行降序排列reverse将序列中的元素顺序进行反转

int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };    //创建数组var lint = inter.OrderByDescending(i => i);  //1.使用降序排列元素var lint = inter.Reverse();//反转集合


聚合操作

常用聚合关键字count获取集合中元素的数量,或者获取满足条件的数量sum获取集合中元素的总和max获取集合中元素的最大值min获取集合中元素的最小值average获取集合中元素的平均值aggregate对集合中的元素进行自定义的聚合计算longCount获取集合中元素的数量,或计算序列满足一定条件的数量,一般计算大型集合中的
元素数量

int[] inter = { 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };    //创建数组 var Maxlint = inter.Max(); //获取最大值var Minlint = inter.Min();  //获取最小值//上述并未使用lambda表达式,如果要写lambda表达式,如下代码所示var Maxlint = inter.Max(i => i);//获取最大值var Minlint = inter.Min(i => i);var Countlint = inter.Count(i => i > 5);//获取大于5的元素数量var Arrlint = inter.Average(i => i); //获取平均值var aq = inter.Aggregate((x, y) => x + y);        //使用自定义的Aggregate方法










原创粉丝点击