获取数据列表。

//获取数据列表,Model是类
IList<Model> list = dao.getmx(Model, pageInfo);
//DataTable数据
DataTable dt = ......;

GroupBy与group by

//GroupBy
//单条件,并返回序列中满足指定条件的第一个元素(相当于list按照user_type去重,可以是多条).
list = list.GroupBy(a => a.user_type).Select(it => it.First()).ToList(); //多条件,使用了匿名函数.
var quary = list.Where(a => a.p_num == "" || a.c_num == "")
.GroupBy(a => new { student_id = a.student_id, user_type = a.user_type })
.Select(group => new
{
student_id = group.Key.student_id,
user_type = group.Key.user_type,
Count = group.Count()
}); //group by
//单条件
var quary = from a in list.Where(a => "1,8".Contains(a.user_type))
group a by new { a.school } into m
select new
{
school = m.Key.school
}; //多条件
var quary = from a in list.Where(a => "1,8".Contains(a.user_type))
group a by new { a.provice, a.school } into m
select new
{
provice = m.Key.provice,
school = m.Key.school
}; //quary取值方法,此处可写可不写ToList()。
//经过测试,数据30W,无ToList()比ToList()的耗时少几百毫秒,具体原因未知。下面是实验的几组数据:第一次9689 9398,第二次13529 10458,第三次10772 10392,第四次11370 10833。实际差距并不大。
foreach (var item in quary.ToList())
{
//取值item
}

Where条件筛选。

//将provice=吉林的筛选出来。
list = list.Where(x => x.provice == "吉林").ToList(); //将包含1,5条件的数据筛选出来,相当于sql里的in用法:select * from 表 where user_type in (1,5)
list= list.Where(a => "1,5".Contains(a.user_type)).ToList(); //此处等同于上面
list= list.Where(a => a.user_type == "" || a.user_type == "").ToList(); //另一种形式,from开头
IList<Model> query = (from item in list
where ("," + projectmodel.ids + ",").Contains("," + item.id + ",")
select item).ToList<Model>();

Select(取list中的id列数据,并按逗号分隔成字符串。例:1,2,3,4,5)

//方式一
//分成key-value的数组
string[] id = list.Select(a => a.id.ToString()).ToArray();
//dt是datatable类型的,执行LINQ语句,这里的.AsEnumerable()是延迟发生,不会立即执行,实际上什么都没有发生
string[] id = dt.AsEnumerable().Select(a => a.Field<int>("id").ToString()).ToArray();
//将数组变成1,2,3,4,5的字符串
string ids = string.Join(",", id); //方式二
//效果等同于foreach循环
foreach (var i in list)
{
ids += i.id + ",";
}
ids = ids.TrimEnd(','); 上述代码使用LINQ 针对数据集中的数据进行筛选和整理,同样能够以一种面向对象的思想进行数据集中数据的筛选。
在使用LINQ 进行数据集操作时,LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ 查询,所以需要使用AsEnumerable 方法返回一个泛型的对象以支持LINQ的查询操作。 .AsEnumerable()与相对应的.AsQueryable()的区别:
1) AsEnumerable()是 LINQ TO OBJECT,AsQueryable()是 LINQ TO SQL
2) AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
3) AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。
4) .ToList()立即执行

Where与Select的同时使用,取list中的id列数据,并按逗号分隔成字符串。

string[] id = list.Where(a => !string.IsNullOrEmpty(a.user_type)).Select(a => a.id).ToArray();
//ids="1,2,3,4,5,6,7";
string ids = string.Join(",", id);

左联与内联(例子是DataTable类型)

//dt,dt1,dt2都为DataTable类型。
//左联比内联,需要多写into,需要多写from gc1 in corr.DefaultIfEmpty(),需要多写corr=gc1。
//当on为单条件时。
var results = from student in dt.AsEnumerable()
join user in dt1.AsEnumerable() on student.Field<int>("student_id") equals user.Field<int>("id")//内联
join corr in dt2.AsEnumerable() on student.Field<int>("id") equals corr.Field<int?>("studentproject_id") into corr//左联
from gc1 in corr.DefaultIfEmpty()
select new
{
student,
user,
corr = gc1
}; //当on为多条件时,借助于匿名类型:其实和解决按多条件分组的思路是一样的。
var results = from student in dt.AsEnumerable()
join zrs in result_zrs on new { districtcounty = student.Field<string>("districtcounty"), school = student.Field<string>("school") }
equals new { districtcounty = zrs.districtcounty, school = zrs.school } into zrs
from gc1 in zrs.DefaultIfEmpty()
select new
{
student,
corr = gc1
}; //取值方式
foreach (var i in results.ToList())
{
name = i.user.Field<string>("name");
}

OrderBy排序

//1个排序
list.OrderBy(a => a.student_id);
//2个排序
list.OrderBy(a => a.student_id).ThenBy(a => a.name);
//多个排序
list.OrderBy(a => a.student_id).ThenBy(a => a.name).ThenBy(a => a.sex);
//参数排序
List<string> liststr = new List<string>();
liststr.Add("aaa");
liststr.Add("bbb");
liststr.Add("ccc");
liststr = liststr.OrderBy(a => a).ToList();//aaa bbb ccc
liststr = liststr.OrderBy(a => a == "bbb" ? "1" : a == "ccc" ? "2" : "3").ToList();//bbb ccc aaa

OrderBy随机排序

//方式一
Random rd = new Random(); List<string> liststr = new List<string>();
liststr.Add("aaa");
liststr.Add("bbb");
liststr.Add("ccc");
liststr.Add("");
liststr.Add("");
liststr.Add("");
//随机一个
var s = liststr.OrderBy(_ => Guid.NewGuid()).First();
//随机两个
var ss = liststr.OrderBy(_ => Guid.NewGuid()).Take();
//乱序
var sss = liststr.OrderBy(o => rd.Next(, liststr.Count())).ToList();
//方式二
Random rd = new Random();
list.OrderBy(_=>rd.Next(,)).First();
//随机排序通用方法
//就是从原List中每次随机取一项,添加到新的List中,并在原List中删除。这样重复,直到原List为空为止。
//不过要注意,如果要保护原List不受变化,就必须先Copy一份List,再在Copy上进行操作
public static List<T> GetRandomList<T>(List<T> inputList)
{
//Copy to a array
T[] copyArray = new T[inputList.Count];
inputList.CopyTo(copyArray); //Add range
List<T> copyList = new List<T>();
copyList.AddRange(copyArray); //Set outputList and random
List<T> outputList = new List<T>();
Random rd = new Random(DateTime.Now.Millisecond); while (copyList.Count > )
{
//Select an index and item
int rdIndex = rd.Next(, copyList.Count - );
T remove = copyList[rdIndex]; //remove it from copyList and add it to output
copyList.Remove(remove);
outputList.Add(remove);
}
return outputList;
}

Skip,Take分页(LINQ:使用Take和Skip实现分页)

//Skip是起始数据,表示从第n+1条数据开始.(此处pageNum应从0开始)
//pageNum:页数、=0是第一页,pageSize:一页多少条
list = list.Skip(pageNum * pageSize).Take(pageSize).ToList();
//取前1-10条
list = list.Skip().Take().ToList();
//也可以这么写取前1-10条
list = list.Take().ToList();
//取第11-20条
list = list.Skip().Take().ToList();

Distinct去重

//字符串数组
string[] idlist = new string[ ]{"aaa","bbb","aaa"};
//去除重复aaa
idlist = idlist.Distinct().ToArray();

相关文章:.NET/C# 优化心得

Linq:使用Take和Skip实现分页

linq的一些用法总结的更多相关文章

  1. C# LINQ查询表达式用法对应Lambda表达式

    C#编程语言非常优美,我个人还是非常赞同的.特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美 ...

  2. LinQ to SQL用法详解

    LinQ是指集成化查询语言,通过映射将数据库内的表名变为C#的类名,将列名作为属性名,将表的关系作为类的成员对象.O--M--R O-Object对象(李昌辉)R-Relation关系M-Mappin ...

  3. C# Linq基本常用用法

    1.什么是Linq? Lanaguage Interated Query(语言集成查询),Linq 是集成C# 和VB这些语言中用于提供数据查询能力的一个新特性. 这里只介绍两种基本常用用法. 学习方 ...

  4. C# 当中 LINQ 的常规用法(Lambda 方式)

    仅以本篇博文记录 LINQ 相关操作的基本知识,原型参考自 MSDN 相关知识,中间加以自己的理解与 DEMO. 1. IEnuemrable<T>.Select() Select 方法比 ...

  5. linq lambda GroupBy 用法

    Linq 中按照多个值进行分组(GroupBy)   /// <summary>要查询的对象</summary> class Employee { public int ID ...

  6. Linq:Group By用法

    1.简单形式: var q =from p in db.Products group p by p.CategoryID into g select g; 语句描述:使用Group By按Catego ...

  7. linq.js的用法

    linq.js 详细介绍 linq.js 是一个 JavaScript 实现的 LINQ. 主要特性: 实现所有 .NET 4.0 的方法 complete lazy evaluation full ...

  8. ASP.NET中LINQ的基本用法

    此Demo只是一个极其简单的LINQ查询Demo 一个类 using System; using System.Collections.Generic; using System.Linq; usin ...

  9. LINQ的基本用法

    1.var q =from c in db.Customers select c.ContactName; 这个语句只是一个声明或者一个描述,并没有真正把数据取出来,只有当你需要该数据的时候,它才会执 ...

随机推荐

  1. Extjs打开window窗口自动加载html网页

    Window inherits the autoLoad config option from Panel. Note that I included all config options below ...

  2. Java NIO API详解

    在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API.对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端 ...

  3. Light OJ 1030 - Discovering Gold

    题目大意: 给你一个1*N的方格,你初始位置是在1,给你一个骰子,假设你现在的位置是X,你投掷一个骰子掷的点数是y, 那么你的新位置就是 X+y, 并且你可以得到新位置的宝藏.假如X+y > N ...

  4. 高等数学(拉格朗日乘子法):NOI 2012 骑行川藏

    [NOI2012] 骑行川藏 输入文件:bicycling.in   输出文件:bicycling.out   评测插件 时间限制:1 s   内存限制:128 MB NOI2012 Day1 Des ...

  5. 【模拟】NEERC15 A Adjustment Office (2015-2016 ACM-ICPC)(Codeforces GYM 100851)

    题目链接: http://codeforces.com/gym/100851 题目大意: 一个N*N的矩阵A,Ai,j=i+j,Q次操作,每次分两种,R r取出第r行还未被取的所有数,并输出和.C c ...

  6. 【模拟】Codeforces 710C Magic Odd Square

    题目链接: http://codeforces.com/problemset/problem/710/C 题目大意: 构造一个N*N的幻方.任意可行解. 幻方就是每一行,每一列,两条对角线的和都相等. ...

  7. C#代码实现隐藏任务栏、开始菜单和禁用任务管理

    一:截图,主要是调用系统接口和更改注册表实现功能 二:代码 using System; using System.Collections.Generic; using System.Linq; usi ...

  8. 滑雪 (搜索)(dp)(贪心)

    以每一点为起点找出所有路径,并求出以此点做为起点的最大路径 求出每个点的最大路径后再找出其中最大的值,输出最大值 #include <stdio.h>#include <string ...

  9. Linux下多任务间通信和同步-概述

    Linux下多任务间通信和同步-概述 嵌入式开发交流群280352802,欢迎加入! 在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对 ...

  10. Axure7.0.0.3155注册码

    Licence:aaa Key1:h624pifAqt7It5e8boKkML+Y4RjDX5xknP4k7QktJYQoxsvv7VUS7hBCv/2ef45P Key2:2GQrt5XHYY7SB ...