广告
返回顶部
首页 > 资讯 > 精选 >怎么在c#中使用Linq查询语句
  • 363
分享到

怎么在c#中使用Linq查询语句

2023-06-14 12:06:26 363人浏览 泡泡鱼
摘要

怎么在C#中使用Linq查询语句?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Lambda表达式简介:      &

怎么在C#中使用Linq查询语句?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Lambda表达式简介:

              delegate int del(int i);                static void Main(string[] args)              {                    del myDelegate = x => x * x;                     int j = myDelegate(5); //最后j = 25                 }

基本查询

语句:

 var query = from r in listStudents where r.score < 60 orderby r.score descending select r; //var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使用Lambda表达式

例子:

/// <summary>        /// 学生结构体        /// </summary>        struct Student        {            /// <summary>            /// 姓名            /// </summary>            public string name;            /// <summary>            /// 年龄            /// </summary>            public int age;            /// <summary>            /// 班号            /// </summary>            public int grade;            /// <summary>            /// 分数            /// </summary>            public float score;        }/// <summary>        /// linq        /// 基本查询        /// </summary>        static void Linq1()        {            #region 构造查询数据            List<Student> listStudents = new List<Student>();            Random pRandom = new Random();            for (int i = 1; i < 50; i++)            {                float sc = pRandom.Next(0, 100);                int age = pRandom.Next(8, 13);                int gde = pRandom.Next(1, 6);                string name = "";                switch (pRandom.Next(0, 6))                {                    case 1: name = "周xxx"; break;                    case 2: name = "李xxx"; break;                    case 3: name = "孙xxx"; break;                    case 4: name = "钱xxx"; break;                    default: name = "赵xxx"; break;                }                Student psdt = new Student();                psdt.name = name;                psdt.age = age;                psdt.grade = gde;                psdt.score = sc;                listStudents.Add(psdt);            }            #endregion            //从50个学生中选择出不及格的人员名单并按分数降序排列            var query = from r in listStudents where r.score < 60 orderby r.score descending select r;            //var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使用Lambda表达式            //orderby升序即从小到大,orderby r.score descending降序即从大到小            Console.WriteLine("不及格的人员名单:");            foreach (Student st in query)            {                Console.WriteLine("***************");                Console.WriteLine("姓名:"+st.name);                Console.WriteLine("班级:"+st.grade);                Console.WriteLine("年龄:"+st.age);                Console.WriteLine("分数:"+st.score);            }            Console.ReadKey();        }

延迟查询属性

linq查询为延迟查询,只需构造一次查询语句,可以多次使用。

例子:

/// <summary>        /// Linq        /// 延迟查询        /// linq查询为延迟查询,只需构造一次查询语句,可以多次使用        /// </summary>        static void Linq2()        {            #region 构造查询数据            List<string> lists = new List<string> { "Jack","Pet","Hant","Li","Kkk"};                        #endregion            var query = from r in lists where r.StartsWith("J") select r;            Console.WriteLine("第一次查询结果:");            foreach (string st in query)            {                Console.WriteLine( st);            }            Console.WriteLine("第二次查询结果:");            lists.Add("Jone");            lists.Add("Jimi");            lists.Add("Johu");            foreach (string st in query)            {                Console.WriteLine(st);            }            Console.ReadKey();                    }

类型筛选

利用OfType方法可以把特定类型数据筛选出来。

例子

/// <summary>        /// Linq类型筛选-ofType        /// </summary>        static void Linq3()        {            object[] pList = new object[] { 1,"one",2,"two",3,"three"};            var query = pList.OfType<string>();            foreach (var st in query)            {                Console.WriteLine(st);            }            Console.ReadKey();                    }

复合from子句

语句:

 var query = from s in listStudents                         from n in s.name                         where n == '赵' orderby s.score descending                         select s.grade + "班-" + s.name + ",分数" + +s.score;            

例子:

/// <summary>        /// linq复合from字句        /// </summary>        static void Linq4()        {            #region 构造查询数据            List<Student> listStudents = new List<Student>();            Random pRandom = new Random();            for (int i = 1; i < 50; i++)            {                float sc = pRandom.Next(0, 100);                int age = pRandom.Next(8, 13);                int gde = pRandom.Next(1, 6);                string name = "";                switch (pRandom.Next(0, 6))                {                    case 1: name = "周xxx"; break;                    case 2: name = "李xxx"; break;                    case 3: name = "孙xxx"; break;                    case 4: name = "钱xxx"; break;                    default: name = "赵xxx"; break;                }                Student psdt = new Student();                psdt.name = name;                psdt.age = age;                psdt.grade = gde;                psdt.score = sc;                listStudents.Add(psdt);            }            #endregion            var query = from s in listStudents                         from n in s.name                         where n == '赵' orderby s.score descending                         select s.grade + "班-" + s.name + ",分数" + +s.score;                        foreach (var t in query)            {                Console.WriteLine(t);            }            Console.ReadKey();        }

多级排序

语句:

 //参数越靠前,优先级越高            //先按score排序,当分数相同时再按grade排序...依次类推            var query = from s in listStudents orderby s.score, s.grade, s.age, s.name select s;

例子:

/// <summary>        /// 多级排序        /// </summary>        static void Linq5()        {            #region 构造查询数据            List<Student> listStudents = new List<Student>();            Random pRandom = new Random();            for (int i = 1; i < 50; i++)            {                float sc = pRandom.Next(0, 100);                int age = pRandom.Next(8, 13);                int gde = pRandom.Next(1, 6);                string name = "";                switch (pRandom.Next(0, 6))                {                    case 1: name = "周xxx"; break;                    case 2: name = "李xxx"; break;                    case 3: name = "孙xxx"; break;                    case 4: name = "钱xxx"; break;                    default: name = "赵xxx"; break;                }                Student psdt = new Student();                psdt.name = name;                psdt.age = age;                psdt.grade = gde;                psdt.score = sc;                listStudents.Add(psdt);            }            #endregion            //参数越靠前,优先级越高            //先按score排序,当分数相同时再按grade排序...依次类推            var query = from s in listStudents orderby s.score, s.grade, s.age, s.name select s;            foreach (Student st in query)            {                Console.WriteLine("***************");                Console.WriteLine("姓名:" + st.name);                Console.WriteLine("班级:" + st.grade);                Console.WriteLine("年龄:" + st.age);                Console.WriteLine("分数:" + st.score);            }            Console.ReadKey();        }

分组

语句:

//按国家分组,并选出大于2的组,形成新的集合            var query = from r in listChampion                        group r by r.country into g                        orderby g.Count() descending, g.Key                        where g.Count() >= 2                        select                            new { country = g.Key, count = g.Count() };

例子:

/// <summary>        /// 分组        /// </summary>        static void Linq6()        {            List<Champions> listChampion = new List<Champions>();            listChampion.Add(new Champions() { name = "张**", country = "中国" });            listChampion.Add(new Champions() { name = "赵**", country = "中国" });            listChampion.Add(new Champions() { name = "李**", country = "中国" });             listChampion.Add(new Champions() { name = "李**", country = "中国" });            listChampion.Add(new Champions() { name = "Peter", country = "美国" });            listChampion.Add(new Champions() { name = "Hune", country = "美国" });              listChampion.Add(new Champions() { name = "Hune", country = "美国" });            listChampion.Add(new Champions() { name = "Jack", country = "俄罗斯" });              listChampion.Add(new Champions() { name = "Jack", country = "俄罗斯" });            listChampion.Add(new Champions() { name = "Jimi", country = "英国" });            //按国家分组,并选出大于2的组,形成新的集合            var query = from r in listChampion                        group r by r.country into g                        orderby g.Count() descending, g.Key                        where g.Count() >= 2                        select                            new { country = g.Key, count = g.Count() };            foreach (var o in query)            {                Console.WriteLine("国家:{0},冠军数:{1}个", o.country, o.count);            }            Console.ReadKey();        }

联合查询-join

语句:

//查询出集合qSt中year等于集合qSc中year的元素并形成新的集合            var qjoin = from r in qSt                         join c in qSc                         on r.year equals c.year                         select new                         {                            Year = r.year,                             stName = r.name,                            scName = c.name                         };

例子:

/// <summary>        /// 联合查询-join        /// </summary>        static void Linq7()        {            List<s> pSt = new List<s>();            pSt.Add(new s() {year=1999,name="xxx" });            pSt.Add(new s() { year = 2000, name = "xxx" });            pSt.Add(new s() { year = 2001, name = "xxx" });            pSt.Add(new s() { year = 2010, name = "xxx" });            List<school> pSc = new List<school>();            pSc.Add(new school() { year = 1999, name = "***" });             pSc.Add(new school() { year = 2001, name = "***" });            pSc.Add(new school() { year = 2002, name = "***" });            pSc.Add(new school() { year = 2010, name = "***" });            pSc.Add(new school() { year = 2012, name = "***" });            var qSt = from r in pSt where r.year >= 2000 select r;            var qSc = from r in pSc where r.year >= 2000 select r;            //查询出集合qSt中year等于集合qSc中year的元素并形成新的集合            var qjoin = from r in qSt                         join c in qSc                         on r.year equals c.year                         select new                         {                            Year = r.year,                             stName = r.name,                            scName = c.name                         };            foreach (var ite in qjoin)            {                Console.WriteLine(ite.Year + " " + ite.scName + " " + ite.stName);                Console.WriteLine("");            }            Console.ReadKey();        }

合并-zip()

.net4.0新增,可对两个相关的序列进行合并。

语句:

              var qZip = qSc.Zip(qSt, (first, second) =>string.FORMat("Year:{0},Name:{1}.", first.Year,second.Name));//返回值qZip为字符串集合

例子:

/// <summary>        /// 合并-zip()-.Net4.0新增,可对两个相关的序列进行合并        /// </summary>        static void Linq8()        {            List<s> pSt = new List<s>();            pSt.Add(new s() { year = 1999, name = "一xxx" });            pSt.Add(new s() { year = 2000, name = "二xxx" });            pSt.Add(new s() { year = 2001, name = "三xxx" });            pSt.Add(new s() { year = 2010, name = "四xxx" });            pSt.Add(new s() { year = 2010, name = "五xxx" });            List<school> pSc = new List<school>();            pSc.Add(new school() { year = 1999, name = "1***" });            pSc.Add(new school() { year = 2012, name = "2***" });            pSc.Add(new school() { year = 2012, name = "3***" });            pSc.Add(new school() { year = 2012, name = "4***" });            pSc.Add(new school() { year = 2012, name = "5***" });            var qSt = from r in pSt where r.year >= 2000 orderby r.year select new { Year = r.year, Name = r.name };            var qSc = from r in pSc where r.year >= 2000 orderby r.year select new { Year = r.year, Name = r.name };                        var qZip = qSc.Zip(qSt, (first, second) =>string.Format("Year:{0},Name:{1}.", first.Year,second.Name));//返回值qZip为字符串集合                       foreach (var ite in qZip)            {                Console.WriteLine(ite);            }            Console.ReadKey();        }

分区(分页)

通过Take()和Skip()实现只显示部分查询结果。

语句:

 //通过skip跳过指定数量的元素,再通过take提取固定长度元素,可实现分页                var qr = (from r in listStudents orderby r.score descending select r).Skip(i * pageSize).Take(5);                //var qr2 = listStudents.OrderByDescending(r => r.score).Select(r => r).Skip(i * pageSize).Take(5);//或

例子

/// <summary>        /// 分区(分页)-通过Take()和Skip()实现只显示部分查询结果        /// </summary>        static void Linq9()        {            #region 构造查询数据            List<Student> listStudents = new List<Student>();            Random pRandom = new Random();            for (int i = 1; i < 50; i++)            {                float sc = pRandom.Next(0, 100);                int age = pRandom.Next(8, 13);                int gde = pRandom.Next(1, 6);                string name = "";                switch (pRandom.Next(0, 6))                {                    case 1: name = "周xxx"; break;                    case 2: name = "李xxx"; break;                    case 3: name = "孙xxx"; break;                    case 4: name = "钱xxx"; break;                    default: name = "赵xxx"; break;                }                Student psdt = new Student();                psdt.name = name;                psdt.age = age;                psdt.grade = gde;                psdt.score = sc;                listStudents.Add(psdt);            }            #endregion            int pageSize = 5;            int numofPage = (int)Math.Ceiling(listStudents.Count /(double)pageSize);            for (int i = 0; i < numofPage; i++)            {                Console.WriteLine("第{0}页", i);                //通过skip跳过指定数量的元素,再通过take提取固定长度元素,可实现分页                var qr = (from r in listStudents orderby r.score descending select r).Skip(i * pageSize).Take(5);                //var qr2 = listStudents.OrderByDescending(r => r.score).Select(r => r).Skip(i * pageSize).Take(5);//或                foreach (var ite in qr)                {                    Console.WriteLine(ite.name);                    Console.WriteLine(ite.score);                }                Console.WriteLine("");            }            Console.ReadKey();        }

并行linq

并行查询可以分解查询的工作,使其分布在多个线程上。当pc拥有多个cpu时,可以看到并行查询带来的改进效果。并行LINQ适用于大型的集合查询,并拥有一定的优势。使用

System.Collections.Concurrent.Partitioner.Create
可以手动创建分区器。
语法:

var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查询//var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查询(Lambda表达式)

例子:

/// <summary>        /// 并行linq        /// </summary>        static void Linq11()        {            Console.WriteLine("开始构造大数组...");            //构造大数组            const int count = 100000000;            var data = new int[count];            var r = new Random();            for (int i = 0; i < count; i++)            {                data[i] = r.Next(40);            }            Console.WriteLine("开始计算...");            var st = System.DateTime.Now;            var sum = (from x in data where x > 20 select x).Sum();//常规linq-耗时1.8641s            var st2 = System.DateTime.Now;            var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查询-耗时0.6620s            //var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查询----x3 => x3 > 20(Lambda表达式)            var st3 = System.DateTime.Now;                        var sum4 = (from c in System.Collections.Concurrent.Partitioner.Create(data, true).AsParallel() where c > 20 select c).Sum();            var dt1 = st2 - st;            var dt2 = st3 - st2;            Console.WriteLine("常规linq耗时:{0}s",dt1.TotalSeconds.ToString());            Console.WriteLine("并行linq耗时:{0}s", dt2.TotalSeconds.ToString());            Console.ReadKey();        }

输出结果:

怎么在c#中使用Linq查询语句

可以粗鲁的认为并行linq对于大集合的查询是优势比较明显的。

取消长时间运行的并行linq查询

对于并行ling而言,可以设置可以利用System.Threading.CancellationTokenSource设置取消操作。

语法:

 //通过.WithCancellation(cts.Token)设置                    var sum = (from x in data.AsParallel().WithCancellation(cts.Token) where x < 20 select x).Average();

例子:

/// <summary>        /// 取消长时间运行的并行linq查询        /// </summary>        static void Linq12()        {            //构造大数组            const int count = 100000000;            var data = new int[count];            var r = new Random();            for (int i = 0; i < count; i++)            {                data[i] = r.Next(40);            }            var cts = new System.Threading.CancellationTokenSource();            new System.Threading.Thread(() =>            {                try                {                    //通过.WithCancellation(cts.Token)设置                    var sum = (from x in data.AsParallel().WithCancellation(cts.Token) where x < 20 select x).Average();                    Console.WriteLine("sum:{0}", sum);                }                catch(OperationCanceledException ex)                {                    Console.WriteLine(ex.Message);                }            }).Start();            Console.WriteLine("计算开始...");            Console.WriteLine("取消请按n!");            var rk = Console.Read();            if(rk=='n'||rk=='N')            {                cts.Cancel();            }        }

看完上述内容,你们掌握怎么在c#中使用Linq查询语句的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎么在c#中使用Linq查询语句

本文链接: https://www.lsjlt.com/news/270790.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在c#中使用Linq查询语句
    怎么在c#中使用Linq查询语句?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Lambda表达式简介:      &...
    99+
    2023-06-14
  • Linq查询语法怎么使用
    这篇文章主要介绍“Linq查询语法怎么使用”,在日常操作中,相信很多人在Linq查询语法怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linq查询语法怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • 怎么在Oracle中使用OVER查询语句
    本篇文章为大家展示了怎么在Oracle中使用OVER查询语句,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、rank()/dense_rank() over(pa...
    99+
    2022-10-18
  • LINQ查询怎么使用
    本篇内容主要讲解“LINQ查询怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LINQ查询怎么使用”吧!LINQ是Visual Studio 2008及其以后版本中提供的功能,将强大的查询...
    99+
    2023-06-17
  • C#集合查询Linq在项目中使用详解
    目录Linq LambdaLinq项目中的一次使用经历Linq to js [在前端的应用]要说哪门后端语言的语法优雅,那就不得不提C#,而在我看来,LINQ语法可以说是其优雅的重要...
    99+
    2022-11-13
  • C#集合查询Linq在项目中如何使用
    这篇文章主要介绍“C#集合查询Linq在项目中如何使用”,在日常操作中,相信很多人在C#集合查询Linq在项目中如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#集合查询Linq在项目中如何使用”的疑...
    99+
    2023-06-30
  • C#中如何使用LINQ查询数据
    C#中如何使用LINQ查询数据,需要具体代码示例LINQ(Language Integrated Query)是C#中的一种强大的查询语言,它可以帮助开发者简化对数据的查询和操作。本文将介绍如何在C#中使用LINQ查询数据,并提供具体的代码...
    99+
    2023-10-22
    C# 查询数据 C#中的关键词: LINQ
  • MySQL子查询语句怎么使用
    这篇“MySQL子查询语句怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL...
    99+
    2023-03-06
    mysql
  • LINQ中怎么利用 from子句实现复合查询
    LINQ中怎么利用 from子句实现复合查询,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。用LINQ from子句进行复核查询using System; &...
    99+
    2023-06-17
  • LINQ模糊查询怎么使用
    本篇内容主要讲解“LINQ模糊查询怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LINQ模糊查询怎么使用”吧!LINQ模糊查询实现的多条件复合搜索效果如下图:LINQ模糊查询实现阶段一:...
    99+
    2023-06-17
  • LINQ查询技术怎么使用
    本篇内容介绍了“LINQ查询技术怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!LINQ TO SQL是LINQ技术在数据库方面的应用...
    99+
    2023-06-17
  • 在SQLServer中使用子查询更新语句
    测试环境准备 create table #table1 ( id int , name varchar(20) ); go create table #t...
    99+
    2022-11-13
  • html5媒体查询语句怎么使用
    本篇内容主要讲解“html5媒体查询语句怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5媒体查询语句怎么使用”吧!html5媒体查询语句是由媒体类型和一个或多个检测媒体特性的条件...
    99+
    2023-07-05
  • SQL语句中怎么查询Index使用状况
    这篇文章将为大家详细讲解有关SQL语句中怎么查询Index使用状况,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。SELECT  ...
    99+
    2022-10-18
  • LINQ+Ajax动态查询怎么使用
    本篇内容主要讲解“LINQ+Ajax动态查询怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LINQ+Ajax动态查询怎么使用”吧!思路:前台发出请求 写明 调用的 modleName 和...
    99+
    2023-06-17
  • linq多条件查询怎么使用
    本篇内容介绍了“linq多条件查询怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!linq多条件查询,当条件为NUll时不做查询,只有...
    99+
    2023-06-17
  • MySQL中怎么优化查询语句
    这篇文章将为大家详细讲解有关MySQL中怎么优化查询语句,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  MySQL常用30种SQL查询语句优化方法  1、...
    99+
    2022-10-18
  • 怎么使用PHP语句查询文件夹
    本篇内容介绍了“怎么使用PHP语句查询文件夹”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,让我们看一下PHP语句如何查询文件夹。PHP...
    99+
    2023-07-05
  • php case when查询语句怎么用
    本教程操作环境:Windows7系统、PHP8.1版、Dell G3电脑。php case when查询语句怎么用?PHP Mysql 中的CASE WHEN 用法在SELECT语句查询中可以使用CASE WHEN对查询出来的结果,...
    99+
    2022-11-22
    php
  • 数据库分组查询语句怎么使用
    在数据库中使用分组查询语句可以对数据进行分组并对每个分组进行聚合操作。常用的分组查询语句是使用SELECT语句结合GROUP...
    99+
    2023-09-15
    数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作