C#中Linq和Lambda表达式的使用整理

文章目录

C#中Linq和Lambda表达式的使用整理

扩展
可以使用 var 让编译器的“类型推断”来简化类型的声明,
在linq中常用 C#的var , 和javaScript的var不一样,
它仍然是强类型的!!!

1. Linq和Lambda简介

Linq: 
	语言集成查询( Language Integrated Query,缩写:Linq),发音"link",是微软的一项技术,新增一种自然查询的SQL语法到.NET Framework的编程语言中

Lambda:
	Lambda 表达式,是一种简化的匿名函数,可用于创建委托或表达式目录树。其次,也可以将 Lambda 表达式作为参数进行传递,或者将它作用于函数调用值调用后返回的一个函数来使用。经常在 Linq 中使用 Lambda 表达式

2. Lambda表达式

1.  匿名方法可以写成Lambda表达式:
Func<int, int, string> f1 = (i1,i2) =>{
    return $"{i1}+{i2}={i1 + i2}";
};

2.  可以省略参数数据类型,因为编译器根据委托类型推断出参数类型用=>引出来方法体
	如果委托没有返回值,且方法体只有一行代码,可省略{}
Action<int, string> f1 = (age, name) => Console.WriteLine($"年龄{age},姓名{name}");
f1 (18, "yzk");

3. 如果=>之后的方法体中只有一行代码,且方法有返回值,那么可以省略方法体的{}以及return
Func<int, int, string> f1 = (i1, i2) => $"{i1}+{i2}={i1 + i2}";

4. 如果只有一个参数,参数的()可以省略
Action<string> f1 = s => Console.WriteLine(s);
Func<int, bool> f2 = i => i > 5;

5. 配合lambda能简化数据处理,如:Where
int[] nums = new int[]
 { 3,99,88,77,7,8,9,66,15,7};
IEnumerable<int> items = nums.Where(i=>i>10);//using System.Linq;

3. Lambda常用的扩展方法

3-1 Where方法:筛选满足条件的数据

where方法:	集合的每一项数据都会经过predicate的测试,
			如果针对一个元素,predicate执行的返回值为true,
			那么这个元素就会放到返回值中。
			where参数是一个lambda表达式格式的匿名方法,
			方法的参数e表示当前判断的元素对象。参数的名字可以自定义,如p,m等
// 使用实例:			
//1 Linq
var ss = from r in db.Am_recProScheme
         where r.rpId > 10
         select r;
//2 Lamba 
var ss1 = db.Am_recProScheme.Where(p => p.rpId > 10);
//3 等价的Sql
string sssql = "select * from Am_recProScheme where rpid>10";

3-2 Count()方法:获取数据条数

// 直接使用count
int count1 = list.Count(e => e.Salary > 5000 || e.Age < 30);
// 先使用where再调用count
int count2 = list.Where(e => e.Salary > 5000 || e.Age < 30).Count();

3-3 Any()方法:是否至少有一条数据

// 检查是否符存在符合条件的数据时,Any效率会高些  如:有可能比Count()实现效率高

// 	直接使用Any
bool b1 = list.Any(e => e.Salary > 8000);
// 	先使用where再调用Any
bool b2 = list.Where(e => e.Salary > 8000).Any();

3-4 排序:OrderBy()、OrderByDescending()、ThenBy()、ThenByDescending()

order()对数据正序排序 
orderByDescending()倒序排序 
	对于简单类型排序,也许不用lambda表达式。
	特殊案列:按照最后一个字符排序;
	用Guid或者随机数进行排序 多规则排序:
		可以在OrderBy()OrderByDescending()后继续写ThenBy()ThenByDescending() 

案例:优先按照Age排序,如果Age相同再按照Salary排序
list.OrderBy(e => e.Age).ThenByDescending(e => e.Salary)
//  错误写法:  千万不要下方写法,会以最后一个进行排序的
list.OrderBy(e => e.Age). OrderByDescending (e => e.Salary)

3-5 限制结果集,取部分数据: 去重–groupby/distinct、 截取–skip(n)、Task(n)

【去重 groupby/distinct ==> 参考:】
// Linq语法:
// 		使用group关键字进行表数据去重
  var data= from a in db.orderInfo group p by new {a.orderTypeId} into _group select _group.FirstOrDefault(); 
// 		使用group关键字对多个字段进行表数据去重
  var data= from a in db.orderInfo group p by new {a.orderTypeId,...} into _group select _group.FirstOrDefault(); 
//  Lamda语法:
//		单个去重:  	使用GroupBy关键字进行表数据去重
  var data=db.orderInfo.GroupBy(t=>t.orderTypeId).Select(r => r.First()).ToList(); 
//						使用DistinctBy关键字进行表数据去重  
  var data=db.orderInfo.DistinctBy(t=>t.orderTypeId).ToList(); 
//		多个字段去重: 	使用GroupBy关键字对多个字段进行表数据去重
  var data=db.orderInfo.GroupBy(t=>new{t.orderTypeId,...}).Select(r => r.First()).ToList(); 
// 						使用DistinctBy关键字对多个字段进行表数据去重  
  var data=db.orderInfo.DistinctBy(t=>new{t.orderTypeId,...}).ToList(); 
  
//  sql语法:
//		使用DISTINCT关键字进行表数据去重
  string sqlStr="SELECT DISTINCT orderTypeId  FROM orderInfo";
//		使用GROUP BY关键字进行表数据去重  
  string sqlStr="SELECT orderTypeId FROM orderInfo GROUP BY orderTypeId";


【截取 skip/Task ==> 参考:】
skip(n)跳过n条数据,
Task(n)获取n条数据 
	案例:获取从第2条开始获取3条数据
var items = list.Skip(2).Take(3);

3-6 聚合函数: Max()、Min()、Average()、Sum()、Count()等

// 如取最小值:年龄>30岁中薪水最小的数据
list.Where(e => e.Age > 30).Min(e=>e.Salary)

3-7 分组 GroupBy()

返回值为IGrouping<TKey,TSource>类型的泛型IEnumerable,
	每一组以一个IGrouping对象的形式返回。
	IGrouping是一个继承自IEnumerable的接口,
	IGrouping中Key属性表示这一组的分组数据的值。

// 类似如下Sql的效果:
//		string sql = "select recType,min(rpId) from Am_recProScheme group by recType";
var ss = db.Am_recProScheme.GroupBy(p => p.recType);
foreach (var t in ss )
{
	// t.Key==分组的字段(p.recType) , 
    Response.Write(t.Key + "--" + t.Min(p => p.rpId));
}

3-8 取首条记录 top(1)

// 如 取最后一个可以按倒叙排列再取值
//		Linq写法
var ss = (from r in db.Am_recProScheme
          select r).FirstOrDefault();
          
//		Lambda写法
var ss1 = db.Am_recProScheme.FirstOrDefault();       

3-9 投影 Select,类似Java中Steam的map/flatmap

效果: 把集合中的每一项转换为另外一种类型
// 实例:
IEnumerable<int> 	ages = list.Select(e => e.Age);
IEnumerable<string> names = list.Select(e=>e.Gender?"男":"女");
var dogs = list.Select(p=>new Dog{NickName=e.Name,Age=e.Age});

// 匿名类型:
var p  = new {Name="tom",Id=1};
var p1 = new {name,Id=1,p.Age};

var items = list.Select(e=>new {e.Name,e.Age,XingBie= e.Gender ? "男" : "女"});
var items = list.GroupBy(e => e.Gender).Select(g=>new { Gender=g.Key,Count=g.Count(),AvgSalary= g.Average(e => e.Salary),MinAge= g.Min(e => e.Age)});

3-10 链式调用

集合转换:
	有一些地方需要数组类型或者List类型的变量,
	可以用ToArray()方法和ToList(), 分别把IEnumerable<T>,转换为Array和List<T>

链式调用:
	Where、Select、OrderBy、GroupBy、Task、Skip等返回值都是IEnumerable<T>类型,
	所以可以链式调用

4. Linq和Lambda具体代码示例参考:

4-1 简单的查询语句

// Linq语法:
  var data=from a in db.Areas select a ;
// Lamda语法:
  var data=db.Areas;
// sql语法:
  string sqlStr=" SELECT * FROM Areas  ";

4-2 带where的查询

// Linq语法:
  var data=from a in db.orderInfo where a.orderId > 20 select a ;
// Lamda语法:
  var data=db.orderInfo.Where( t=>t.orderId > 20 ) ;
// sql语法:
  string sqlStr=" SELECT * FROM orderInfo WHERE orderId > 20 ";

4-3 简单的函数计算(count,min,max,sum)

// Linq语法:
  var data=( from a in db.orderInfo select a ).Max( p=>p.orderId ) ;//查询该表中最大编号Id
  var data=( from a in db.orderInfo select a ).Min( p=>p.orderId ) ;//查询该表中最小编号Id
  var data=( from a in db.orderInfo select a ).Count() ;//查询该表数据总条数
  var data=( from a in db.orderInfo select a ).Sum( p=>p.orderMoney ) ;//查询该表中所有消费额的总数(求和)
  
// Lamda语法:
  var data=db.orderInfo.Max( t=>t.orderId );//查询该表中最大编号Id
  var data=db.orderInfo.Min( t=>t.orderId );//查询该表中最小编号Id
  var data=db.orderInfo.Count();//查询该表数据总条数
  var data=db.orderInfo.Sum( t=>t.orderMoney );//查询该表中所有消费额的总数(求和)
  
// sql语法:
  string sqlStr=" SELECT MAX(orderId) FROM orderInfo ";
  string sqlStr=" SELECT MIN(orderId) FROM orderInfo ";
  string sqlStr=" SELECT COUNT(*) FROM orderInfo ";
  string sqlStr=" SELECT SUM(orderMoney ) FROM orderInfo ";


4-4 排序order by desc/asc

// Linq语法:
  var data=from a in db.orderInfo where a.orderId > 20 orderby a.orderId descending select a ;//倒序排序,升序可用ascending关键字
  
// Lamda语法:
  // 情况一,根据单字段排序: OrderByDescending
  var data=db.orderInfo.OrderByDescending( t=>t.orderId ).Where( t=>t.orderId > 20 ) .ToList();// 升序可用OrderBy关键字
  // 情况二,根据多字段主次排序:OrderBy == ThenBy
  var priceMonthEntities = priceMonthApp.GetList().OrderBy(t => t.F_Year).ThenBy(t => t.F_Month).ToList();//先按年升序,再按月升序
  
// sql语法:
  string sqlStr=" SELECT * FROM orderInfo WHERE orderId > 20 ORDER BY orderId DESC  ";//倒序排序,升序可用ASC关键字

4-5 top(1)

// Linq语法:  取集合中第一个记录
var ss = (from r in db.Am_recProScheme
          select r).FirstOrDefault();
// Lamda语法: 
var ss1 = db.Am_recProScheme.FirstOrDefault();
//var ss1 = db.Am_recProScheme.First();   
// Sql语法:       
string sssql = "select top(1) * from Am_recProScheme";


//	取最后一个记录,先倒序排列再取值 ,实例如下:
lists.Reverse();  // 先对集合进行倒序
var s2 = lists.FirstOrDefault();
MessageBox.Show(s2.ToString());

4-6 跳过前N条取余下的数据 Skip

//1 Linq语法:
var ss = (from r in db.Am_recProScheme
          orderby r.rpId descending
          select r).Skip(10); //跳过前10条数据,取10条之后的所有数据   
//2 Lamda语法:  
var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Skip(10).ToList();
//3 Sql语法:
string sssql = "select * from  (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10";

4-7 截取指定长度的数据 Take

//1 Linq语法:
var ss = (from r in db.Am_recProScheme
          orderby r.rpId descending
          select r).Take(10); // 截取前10条数据  
//2 Lamda语法:  
var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Take(10).ToList();
//3 Sql语法:
string sssql = "select * from  (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum<=10";

4-8 分页查询: Skip、Take组合使用

【参考1:】
// Linq语法:
  var data=( from a in db.orderInfo select a ) .Skip((pageIndex-1) * pageSize).Take(pageSize).ToList();
// Lamda语法: pageIndex:当前页码,pageSize:分页数据显示条数
  var data=db.orderInfo.Skip((pageIndex-1)* pageSize).Take(pageSize).ToList();  
// sql语法:
  string sqlStr="SELECT TOP pageSize * FROM orderInfo WHERE orderId NOT IN(SELECT TOP( ( pageIndex - 1) * pageSize) orderId FROM orderInfo)";

【参考2:】
// 1 Linq语法:
var ss = (from r in db.Am_recProScheme
          where r.rpId > 10
          orderby r.rpId descending
          select r).Skip(10).Take(10); //取第11条到第20条数据
          
//2 Lamda语法:   Take(10): 数据从开始获取,获取指定数量(10)的连续数据
var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).Skip(10).Take(10).ToList();
//3 Sql语法:
string sssql = "select * from  (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10 and rowNum<=20";

4-9 包含Contains , 类似like ‘%%’

// Linq语法:  使用Contains关键字进行模糊匹配
  var data= from a in db.orderInfo where a.orderId.Contains(1) select a;
// Lamda语法:  使用Contains关键字进行模糊匹配
  var data=db.orderInfo.Where(t=>t.F_UserId.Contains("1")).ToList();
// sql语法:   使用like关键字进行模糊匹配
  string sqlStr="SELECT * FROM orderInfo WHERE orderId LIKE '%12%'";

4-10 分组group by

【参考1:】
// Linq语法:
  var data= from a in db.orderInfo orderby a.orderId descending 
            group a by a.orderType into s select new{
            s.key,//分组字段
            s.sMoney=s.Sum(a=>a.orderMoney),//分组后算出总的消费额
            s.maMoney=s.Max(a=>a.orderMoney),//分组后算出最大的消费额
            s.miMoney=s.Min(a=>a.orderMoney)//分组后算出最小的消费额
            };
// Lamda语法:
  //使用GroupBy关键字进行分组查询(单个字段)
  var data=db.orderInfo.GroupBy(p => p.recType).Select(t=>t.Key).ToList();
  //使用GroupBy关键字进行分组查询(多个字段)
  var data=db.orderInfo.GroupBy(p =>new{ p.recType,p.orderId}).Select(t=>new{ recType=t.Key.recType,orderId=t.Key.orderId}).ToList();
  
// sql语法:
  string sqlStr="SELECT orderType , SUM(orderMoney), MAX(orderMoney), MIN(orderMoney) FROM orderInfo GROUP BY orderType";


【参考2//1 Linq语法:
var ss = from r in db.Am_recProScheme
         orderby r.rpId descending
         group r by r.recType into n
         select new
         {
             n.Key,  //这个Key是recType
             rpId = n.Sum(r => r.rpId), //组内rpId之和
             MaxRpId = n.Max(r => r.rpId),//组内最大rpId
             MinRpId = n.Min(r => r.rpId), //组内最小rpId
         };
foreach (var t in ss)
{
    Response.Write(t.Key + "--" + t.rpId + "--" + t.MaxRpId + "--" + t.MinRpId);
}
//2 Linq语法:
var ss1 = from r in db.Am_recProScheme
         orderby r.rpId descending
         group r by r.recType into n
         select n;
foreach (var t in ss1)
{
    Response.Write(t.Key + "--" + t.Min(p => p.rpId));
}
//3 Lamda语法:
var ss2 = db.Am_recProScheme.GroupBy(p => p.recType);
foreach (var t in ss2)
{
    Response.Write(t.Key + "--" + t.Min(p => p.rpId));
}
//4 sql语法:
string sssql = "select recType,min(rpId),max(rpId),sum(rpId) from Am_recProScheme group by recType";

4-11 Sql中的In – 通过Contains实现

【实例1:】
// Linq语法:
  var data= from a in db.orderInfo where (new int?[2213,43311,32422]).Contains(a.orderId) select a ; 
// Lamda语法:
  var data=db.orderInfo.Where(t=>(new int?[2213,43311,32422]).Contains(t.orderId)).ToList();
// sql语法:
  string sqlStr="SELECT * FROM orderInfo WHERE orderId IN (2213,43311,32422)";

【实例2:】
// Linq语法:
var ss = from p in db.Am_recProScheme
                  where (new int?[] { 24, 25,26 }).Contains(p.rpId)
                  select p;
foreach (var p in ss)
{
    Response.Write(p.Sorts);
}

// sql语法:
string st = "select * from Am_recProScheme where rpId in(24,25,26)";

4-12 内连接 Inner Join

【参考1// Linq语法:
var ss = from r in db.Am_recProScheme
         join w in db.Am_Test_Result on r.rpId equals w.rsId
         orderby r.rpId descending
         select r;
// Lamda语法:
var ss1 = db.Am_recProScheme.Join(db.Am_Test_Result, p => p.rpId, r => r.rsId, (p, r) => p).OrderByDescending(p => p.rpId).ToList();
// sql语法:
string sssql = "SELECT r.* FROM Am_recProScheme AS r INNER JOIN Am_Test_Result AS t ON r.[rpId] = t.[rsId] ORDER BY r.[rpId] DESC";


【参考2//Linq
var ss = from r in db.Am_recProScheme
         join w in db.Am_Test_Result on r.rpId equals w.rsId
         orderby r.rpId descending
         select r;
         
//Lambda
var ss1 = db.Am_recProScheme.Join(db.Am_Test_Result, p => p.rpId, r => r.rsId, (p, r) => p).OrderByDescending(p => p.rpId).ToList();

//SQL
string sssql = "select r.* from  [Am_recProScheme] as r inner join [dbo].[Am_Test_Result] as t on r.[rpId] = t.[rsId] order by r.[rpId] desc";

4-13 Linq和Lambda实现 左链接、右链接、内链接参考:

4-13-1 先准备个数据类
//客户类
public class Customer
    {
        public int id { get; set; }
        public string name { get; set; }
        public string email { get; set; }
    }
    //联系方式类
  public class CustomerContact
    {
        public int ccid { get; set; }
        public int CustomerId { get; set; }//客户的id,外键
        public string Phone { get; set; }
        public string Address { get; set; }
    }
   //模拟数据
           public static List<Customer> GetCustomer()//客户
        {
            List<Customer> list = new List<Customer>();
            list.Add(new Customer { id = 1, name = "刘德华",  email = "ldh@net.cn" });
            list.Add(new Customer { id = 2, name = "张学友",  email = "zxy@net.cn" });
            list.Add(new Customer { id = 3, name = "黎明",  email = "lm@net.cn" });
            list.Add(new Customer { id = 4, name = "郭富城",  email = "gfc@net.cn" });
            list.Add(new Customer { id = 4, name = "古天乐",  email = "gtl@net.cn" });
            return list;
        }
        public static List<CustomerContact> GetCustomerContact()//联系人
        {
            List<CustomerContact> list = new List<CustomerContact>();
            list.Add(new CustomerContact { ccid = 1,CustomerId=1, Phone="13566769988",Address="北京"});
            list.Add(new CustomerContact { ccid = 2, CustomerId = 1, Phone = "13566769986", Address = "天津" });
            list.Add(new CustomerContact { ccid = 3, CustomerId =2, Phone = "13677889900", Address = "香港" });
            list.Add(new CustomerContact { ccid = 4, CustomerId = 8, Phone = "13677889332", Address = "上海" });
            return list;
        }
4-13-2 Linq:左连接、右连接、内连接
// 1. 左连接
var LeftJoin = from cusetomer in GetCustomer()
                join cc in GetCustomerContact()
                on cusetomer.id equals cc.CustomerId 
                // 内连接的基础上, 加入这行代码就实现类左连接
                into JoinCC from cc in JoinCC.DefaultIfEmpty()
                select new
                {
                    CustomerName = cusetomer.name,
                    phone = cc != null ? cc.Phone : null
                };

// 2. 右连接:
// 		右链接跟左链接相反,只需要改一下顺序就可以了。
 var LightJoin = from cc in GetCustomerContact()
                 join cusetomer in GetCustomer()
                 on cc.CustomerId equals cusetomer.id 
                 // 内连接的基础上, 加入这行代码就实现类左连接
                 into JoinCC from cusetomer in JoinCC.DefaultIfEmpty()
                select new
                {
                    phone = cc.Phone,
                    CustomerName =cusetomer != null ? cusetomer.name : null,
                };
// 3. 内连接:
var InnerJoin = from cc in GetCustomerContact()
                 join cusetomer in GetCustomer()
                 on cc.CustomerId equals cusetomer.id 
                 select new
                 {
                     phone = cc.Phone,
                     CustomerName = cusetomer.name
                 };
// 3-2 内连接:  多个条件关联的join 
var whiteDiagList = (from r1 in diagControlList
        where r1.ControlRelation == 1
        join r2 in args.DiagList on new { code = r1.DiagCode, name = r1.DiagName }
        equals new{code=r2.DiagCode,name=r2.DiagName}
        select r1).ToList<DiagControlModel>();
4-13-3 Lambda:左连接、右连接、内连接 [ 推荐使用上方Linq写法 ]
// 1. 左连接:
var LMLeftJoin = GetCustomer().GroupJoin(GetCustomerContact(), 
 a => a.id, b => b.CustomerId, (a, b) =>new { a,b })
     .SelectMany(c=>c.b.DefaultIfEmpty(), (c, b) 
     =>new { CustomerName= c.a.name,Phone=b!=null?b.Phone:null });

// 2. 右连接:参考左连接,两个集合对调位置就行了

// 3. 内连接:
var LMInnerJoin = GetCustomer().Join(GetCustomerContact(), a => a.id, b => b.CustomerId
, (a, b) => new { CustomerName = a.name, Phone = b.Phone });

4-14 扩展:交集、并集、差集的用法 [了解,使用不多]

4-14-1 简单类型的交集、并集、差集用法:
List<string> ListA = new List<string>();
List<string> ListB = new List<string>();
List<string> ListResult = new List<string>();

ListResult = ListA.Distinct().ToList();//去重
ListResult = ListA.Except(ListB).ToList();//差集
ListResult = ListA.Union(ListB).ToList();  //并集
ListResult = ListA.Intersect(ListB).ToList();//交集
4-14-2 对象类型:List的交集、并集、差集用法

若上面的例子不是List类型,
而是List,则需要对XXXModel进行处理。
步骤如下:

4-14-2-1 先定义Model
    public class ItemModel
    {
        public string ItemCode { get; set; }
        public string ItemName { get; set; }
    }
4-14-2-2 定义Model间如何比较

说明: 若不定义,比较的是两个引用

public class ItemModelComparer : IEqualityComparer<ItemModel>
{
        //比较
        public bool Equals(ItemModel x, ItemModel y)
        {
            bool checkFlag = true;

            if (Object.ReferenceEquals(x, y))
            {
                checkFlag = true;
            }
            else if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            {
                checkFlag = false;
            }
            else
            {
                if (x.ItemCode == y.ItemCode) //若Model有多个条件则需要添加。例如 if(x.ItemCode==y.ItemCode && x.Other==y.Other)
                {
                    checkFlag = true;
                }
                else
                {
                    checkFlag = false;
                }
            }

            return checkFlag;

        }
    
        //实现获取哈希值
        public int GetHashCode(ItemModel model)
        {
            if (Object.ReferenceEquals(model, null)) return 0;
            int hashNurse = model.ItemCode.GetHashCode(); 

//			若两个集合有多个关联条件,则哈希值也需要进行计算
//			int hashOther=model.Other.GetHashCode();
//   		int resultHash=hashNurse^hashOther;
//			return resultHash;

            return hashNurse;
        }
    
    }

4-14-2-3 实例代码参考:
List<ItemModel> ListA = new List<ItemModel>();
List<ItemModel> ListB = new List<ItemModel>();
List<ItemModel> ListResult = new List<ItemModel>();

ListResult = ListA.Distinct(new ItemModelComparer()).ToList();//去重
ListResult = ListA.Except(ListB, new ItemModelComparer()).ToList();//差集
ListResult = ListA.Union(ListB, new ItemModelComparer()).ToList();  //并集
ListResult = ListA.Intersect(ListB, new ItemModelComparer()).ToList();//交集

4-15 一些使用的实例代码:

//数据库 + 自定义名称 =new 数据库
mydbDataContext con = new mydbDataContext();
//模糊查询表达式中用.Contains
con.car.Where(r=>r.name.Contains(TextBox1.Text.Trim())).ToList(;
//开头查用.StartWith
con.car.Where(r => r.name.StartsWith(TextBox1.Text)).ToList();
//结尾查用.EndWith
con.car.Where(r => r.name.EndsWith(TextBox1.Text)).ToList();
//最大值
con.car.Max(r => r.price * r.oil).ToString();
//最小值
con.car.Min(r => r.price).ToString();
//求和
con.car.Sum(r => r.price).ToString();
//平均值
con.car.Average(r => r.price).ToString();
//升序:
con.car.OrderBy(r => r.price).ToList();
//降序:
con.car.OrderByDescending(r => r.price).ToList();

//上一页,下一页,组合查询:
int PageCount = 5;//每页显示条数
//上一页,PageCount_Label.Text为当前页码
int pageNum = Convert.ToInt32(PageCount_Label.Text) - 1;
Repeater1.DataSource = con.car.Skip((pageNum - 1) * PageCount).Take(PageCount);
Repeater1.DataBind(); 
PageCount_Label.Text = pageNum.ToString();
//下一页
int pageNum = Convert.ToInt32(PageCount_Label.Text) + 1;
Repeater1.DataSource = con.car.Skip((pageNum - 1) * PageCount).Take(PageCount);
Repeater1.DataBind();
PageCount_Label.Text = pageNum.ToString();
//组合查询的点击事件
List<car> list = con.car.ToList();
if (TextBox2.Text != "")
{
    List<car> list1 = con.car.Where(r => r.name.Contains(TextBox2.Text)).ToList();
    list = list.Intersect(list1).ToList();
}
if (TextBox3.Text != "")
{
    List<car> list1 = con.car.Where(r => r.oil == Convert.ToDecimal(TextBox3.Text)).ToList();
    list = list.Intersect(list1).ToList();
}
if (TextBox4.Text != "")
{
    List<car> list1 = con.car.Where(r => r.powers == Convert.ToInt32(TextBox4.Text)).ToList();
    list = list.Intersect(list1).ToList();
}
Repeater1.DataSource = list;
Repeater1.DataBind();
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值