关闭

LINQ 常用查询

960人阅读 评论(0) 收藏 举报
分类:

什么是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";//拼写sql
SqlDataAdapter 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方法










0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15692次
    • 积分:294
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类