LINQ(一)
一、linq的基本介绍
1. linq的作用:LINQ是专门对数据进行操作的语句,可以对SQL,xml,dataset,object类型的数据进行分析处理。
2. linq的组成,分为、(1). 数据源、(2). linq语句、(3) linq对象的引用,其中linq语句的执行过程和SQL语句的执行过程相似,SQL语句编译时的执行过程是:【from 表名,where 条件,select *】以下是linq的简单代码示例
3. linq语句语法解析。
from num in numbers
where (num % 2) == 0
select num;
以上两句的语法等同于sql的查询语句的执行顺序,1. from 表名 2.where 条件 3. select 查询字段。
1 private static void test() 2 { 3 //1. data source 数据源 4 int[] numbers = { 0, 1, 2, 3, 4, 5, 6 }; 5 //2. 创建一个query语句,该语句目前还没有被引用执行,只有在引用的时候才会被执行 6 var numQuery = from num in numbers 7 where (num % 2) == 0 8 select num; 9 //3. query的执行 10 foreach (var num in numQuery) 11 { 12 Console.Write("{0},", num); 13 } 14 }
3. linq语句在执行到以上代码第2段【linq语句】的时候还并没有开始执行,只有执行到第三阶段的时候才会被执行,那么如果想要在第二阶段开始就想要执行,就需要加上以下代码:
1 private static void test() 2 { 3 //1. data source 数据源 4 int[] numbers = { 0, 1, 2, 3, 4, 5, 6 }; 5 //2. 创建一个query语句,该语句目前还没有被引用执行,只有在引用的时候才会被执行 6 var numQuery = from num in numbers 7 where (num % 2) == 0 8 select num; 9 //2.1 如果想强制现在就执行,则可以使用以下方法。 10 int queryCount = numQuery.Count();//获取执行以后的结果数 11 numQuery.ToList(); //转换成list 12 numQuery.ToArray(); //转换为array 13 //3. query的执行 14 foreach (var num in numQuery) 15 { 16 Console.Write("{0},", num); 17 } 18 19 }
4. linq的几种基本操作,其中包括,降序(descending)、升序( ascending)、分组(group by)、内连接(join)、数据打包(into)
a. 降序与升序,直接看代码:
1 private static void QueryOperations() 2 { 3 int[] numbers = { 0, 1, 2, 3, 4, 5, 6 , 7 }; 4 var query = from num in numbers 5 where num % 2 == 1 || num % 3 == 1 6 orderby num ascending //descending 降序,ascending 升序 7 select num; 8 foreach (var num in query) 9 { 10 Console.Write("{0}", num); 11 } 12 }
b. 对list集合进行升序降序排序,其中的Userinfo指的是数据源,int指的是对哪一种数据类型进行排序。
//升序排序 //var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderBy<UserInfo, int>(u => u.ID); //降序排序 //var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.ID);
c. linq实现分页查询
1 int pageIndex = 2; 2 int pageSize = 2; 3 var userInfoList = (from u in db.UserInfo 4 where u.ID > 0 5 orderby u.RegTime ascending, u.ID descending 6 select u).Skip<UserInfo>((pageIndex - 1) * pageSize).Take<UserInfo>(pageSize); //Skip:表示跳过多少条记录, Take取多少条记录
d. 取出list中其中几列的数据
1 var userInfoList = from u in db.UserInfo 2 where u.ID == 343 3 select new{UName=u.UserName,UPwd=u.UserPass}; //新建一个匿名类
e .内连接,左连接,右连接
左连接: var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals dept.ID into JoinedEmpDept from dept in JoinedEmpDept.DefaultIfEmpty() select new { EmployeeName = emp.Name, DepartmentName = dept != null ? dept.Name : null }; 右连接: var RightJoin = from dept in ListOfDepartment join employee in ListOfEmployees on dept.ID equals employee.DeptID into joinDeptEmp from employee in joinDeptEmp.DefaultIfEmpty() select new { EmployeeName = employee != null ? employee.Name : null, DepartmentName = dept.Name }; 内连接: var query = from t in entitiy.TB_GCGL_ADA_USER join p in entitiy.TB_GCGL_ZY_ZYK on t.ETPRS_CODE equals p.ETPRS_CODE select new TB_USER_ZYK { USER_ID = t.USER_ID, USER_NAME = t.USER_NAME, USER_PASSWORD = t.USER_PASSWORD, };
f . 通过匿名来根据其中的一列查询表中的数据。其中的第一个u指userinfo。
1 wangjin2Entities1 db = new wangjin2Entities1(); 2 var userinfolist=db.Userinfo.where<Userinfo>(u=>u.ID=3)
g. 联合查询
var res = from m in masterList from k in kongfuList where m.Kongfu == k.Name && k.Power > 90 //select new {master = m, kongfu = k}; select m;
查询不包含列表中的数据
int[] num0 = { 28, 32, 14 }; int[] num1 = { 14, 15, 16 }; var bb = from n1 in num0 where num1.Contains(n1) == false select n1; //bb.ToList(); foreach (var i in bb) { Console.WriteLine(i); }
ArrayList去重,注意:list的去重方式不能用在ArrayList中,至于为什么,我也不知道,然后我研究了一下,自己写一个去重的方法,没办法,我就是这样优秀
ArrayList num0 = new ArrayList(); num0.Add(234); num0.Add(23); num0.Add(24); num0.Add(1234); ArrayList num1 = new ArrayList(); num1.Add(234); num1.Add(53); num1.Add(56); num1.Add(67); foreach (object i in num0) { Console.WriteLine(i); if (num1.Contains(i)) { Console.WriteLine("包含"); } }流程信息部
发现一个简单的过滤的方法:该方法就是指根据id过滤其中不要的数据
var loginUserAllowActions = loginUserMenuActions.Where(a => !forbidActions.Contains(a.ID));
去除列表中重复的值:此处需要提供一个方法
将总的集合中的重复权限清除。 var lastLoginUserActions = loginUserAllowActions.Distinct(new EqualityComparer());
namespace Model { public class EqualityComparer:IEqualityComparer<ActionInfo> { public bool Equals(ActionInfo x, ActionInfo y) //该方法是主要的方法 { return x.ID == y.ID; } public int GetHashCode(ActionInfo obj) { return obj.GetHashCode(); //该方法返回值是随便写的,因为不需要 } } }
补充,如果只是单纯的筛选列表中的数据,可以直接用如下方式
List<PrizeRecords> results = (from n in result where n.UserId.Equals(userId) select n).ToList(); //重点是如下:感受一下 IEnumerable<PrizeRecords> resultss=results.Where<PrizeRecords>(_ => _.UserId.Equals(userId));
List<int?> userIdList = db.Taskrewardrecord.Where(o => o.SiteId == SiteId && o.IsMake == 0).Select(p => p.UserId).Distinct().ToList();
//实际瓜分金额
decimal ActualCarveBonus = Math.Round(ActualBonus / Convert.ToDecimal(ActualLogoCount),2);
//获取配置表
string NowDatrStr = DateTime.UtcNow.AddHours(8).ToString("yyyy-MM-dd HH:mm:ss");// + " 23:59:59";
DateTime nowDate = Convert.ToDateTime(NowDatrStr);
//查询第一条数据
List<Configure> datas = db.Configure.OrderByDescending(t => t.Time).Where(t => t.SiteId == SiteId && t.Status != 1 && t.Status != 3 && t.Status != 4 && t.TriggerTime <= nowDate).ToList();
哪里不懂的,可以关注,留言,我会尽快回复。
欢迎访问: https://www.cnblogs.com/wangjinya