“21天好习惯” 第一期-13

2 where子句

where子句的作用就是筛选元素,除了开始和结束位置,where子句几乎可以出现在LINQ表达式的任意位置。一个LINQ表达式中可以有where子句,也可以没有;可以有一个,可以有多个;多个where子句之间的关系相当于逻辑“与”,每个where子句可以包含1个或多个逻辑表达式,这些条件成为“谓词”,多个谓词之间用布尔运算符隔开,比如逻辑“与”用&&,逻辑“或”用||,而不是用SQL中的and或or。

2.1 常见的where子查询

List<CustomerInfo> clist = new List<CustomerInfo> 
{ 
      new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
      new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
      new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
};

//查询名字是3个字或者姓“令”的,但年龄大于20的客户
    var query = from customer in clist
                where (customer.Name.Length == 3 || customer.Name.Substring(0, 1) == "令")
                && customer.Age > 20
                select customer;

foreach (var ci in query)
{
    Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
}
//结果
//姓名:令狐冲 年龄:23 电话:1380524****

2.2 在where子句中使用自定义函数

private void whereExpDemo()
{
    List<CustomerInfo> clist = new List<CustomerInfo> { 
    new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
    new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
    new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
};

//查询名字是3个字并且姓“令”的客户
var query = from customer in clist
            where (customer.Name.Length == 3 && CheckName(customer.Name))
            select customer;

            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
}
private bool CheckName(string name)
{
     if (name.Substring(0, 1) == "令")
          return true;
     else
          return false;
}
//结果
//姓名:令狐冲 年龄:23 电话:1380524****

2.3 动态谓词的筛选

有时候谓词的数量可能并不固定,是随情况变化的。例如:一组名字可能是运行时动态指定的。

List<CustomerInfo> clist = new List<CustomerInfo> { 
      new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
      new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
      new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
};

//定义动态的谓词数组,这个数组应该由实际运行环境生成
string[] names = { "令狐冲", "任盈盈", "杨过", "小龙女", "欧阳晓晓" };

      //查询在给定谓词数组里存在的客户
      var query = from customer in clist
                  where names.Contains(customer.Name)
                  select customer;

      foreach (var ci in query)
      {
          Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
      }
//结果:

//姓名:欧阳晓晓 年龄:35 电话:1330708****
//姓名:令狐冲 年龄:23 电话:1380524****

3. select子句

 LINQ表达式的结果是使用select子句获得的。select子句可以对数据进行转换,这个过程称为“投影”。select子句产生的类容,取决于前面的所有子句及其自身表达式执行后的结果。

3.1 输出查询结果

最简单的select就是直接输出from子句建立的那个范围变量:

            var query = from customer in clist
                        where names.Contains(customer.Name)
                        select customer;

也可以输出范围变量类型中得某个属性:

select customer.Name;

或者修改一下再输出:

select customer.Name.Replace("gg","mm");

或者干脆使用一个自定义的函数,把范围变量传进去,输出处理后的结果:

select MyFunction(customer.Name);

3.2 对查询结果进行投影

        public class MyCustomerInfo
        {
            public string Name { get; set; }
            public string Tel { get; set; }
        }
        private void whereExpDemo()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                 new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                 new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                 new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
         };

    //定义动态的谓词数组,这个数组应该由实际运行环境生成
            string[] names = { "令狐冲", "任盈盈", "杨过", "小龙女", "欧阳晓晓" };

   //查询在给定谓词数组里存在的客户
    var query = from customer in clist
                where customer.Age < 30
                select new MyCustomerInfo { Name = customer.Name, Tel = customer.Tel };

foreach (var ci in query)
{
 Console.WriteLine("姓名:{0} 电话:{1} 类型{2}", ci.Name, ci.Tel,ci.GetType().FullName);
}
}
//结果:
//姓名:上官飘飘 电话:1592842**** 类型LinqDemo.Form1+MyCustomerInfo
//姓名:令狐冲 电话:1380524**** 类型LinqDemo.Form1+MyCustomerInfo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值