c#中Linq查询语句

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace CSharp
{
    class Linq
    {
        public static void Show(List<Product> fruits)
        {
            foreach (var itme in fruits)
            {
                Console.WriteLine("编号:{0},商品名称:{1},商品价格:{2},商品品牌:{3},商品型号:{4}", itme.Id, itme.Name, itme.Price, itme.Brand, itme.Sell);
            }
        }
        static void Main(string[] args)
        {
            //匿名对象:在方法里面可以直接使用不需要传递,减少代码提高效率
            var ff = new { name = "张三", age = 19 };//这种叫 匿名对象 语法:var 变量名 = { };
            Console.WriteLine(ff.name);
            Console.WriteLine("------------------");

            //对象集合初始化器
            List<string> fruits = new List<string>() { "苹果", "香蕉", "西瓜" };
            fruits.Add("蜜罐");

            Console.Write("请输入水果名:");
            string str = Console.ReadLine();
            //原来的做法(赋值查询)foreach来遍历输出
            foreach (var itme in fruits)
            {
                if (itme.Contains(str)) Console.WriteLine("你输入的水果:" + itme);
            }

            //linq语法:Select * from 数据源(表明)
            var reus = from f in fruits //数据源:也就是一个集合,遍历list
                       orderby f descending //orderby排序(默认的升序) 跟 descending降序   (ascending升序)
                       select f;//显示结果返回给reus变量,可查询字段(如果查询全部直接放变量名) 就像f是变量名  数据库字段 f.id 这种得到字段的所有值
            Console.WriteLine("--------降序排列---------");
            foreach (var itme in reus)
            {
                Console.WriteLine(itme);
            }

            List<Product> plist = new List<Product>() {
                new Product() { Id = 1, Name = "a冰箱", Price = 2300, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "苹果", "香蕉", "西瓜" }},
                new Product() { Id = 1, Name = "b冰箱", Price = 2400, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "木瓜", "芒果", "地瓜" }},
                new Product() { Id = 3, Name = "c冰箱", Price = 2500, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "橘子", "柿子", "水果" }},
                new Product() { Id = 4, Name = "d冰箱", Price = 2600, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "柚子", "香瓜", "西瓜" }}
            };
            Console.Write("请输入商品名称:");
            string name = Console.ReadLine();
            Console.Write("请输入商品价格:");
            string price = Console.ReadLine();

            //linq语法
            var reuslt = from f in plist//数据源:也就是一个集合,遍历list
                         orderby f.Id, f.Name descending, f.Price //默认所有字段都是ascending升序排列 所以不写  然后某个加上descending变成降序
                         where (String.IsNullOrEmpty(name) || f.Name == name) && (String.IsNullOrEmpty(price) || f.Price == Convert.ToInt32(price))
                         select f;//显示结果返回给reuslt对象    IsNullOrEmpty用来表示name为空  前面加!不为空
            Console.WriteLine("--------降序排列---------");
            Show(reuslt.ToList());//显示数据的方法
            //*************************************************************************************************************************************

            Console.Write("请输入爱好:");
            string lovers = Console.ReadLine();

            List<string> loverlist = lovers.Split(',').ToList();//根据用户输入爱好 ,号来划分字符串 
            //复合的from子句:可以解决多对多查询,查询条件是一个集合,数据源也是一个集合
            var reuslt1 = from f in plist//数据源也是一个集合:使用复合子句把数据源集合变成一个一个的字符串
                          from loveritem in f.lover
                          where loverlist.Contains(loveritem) //查询条件是一个集合
                          select f;
            Console.WriteLine("--------复合的from子句:爱好条件也可以是一个集合来查询---------");
            Show(reuslt1.ToList());//显示数据的方法

            //*************************************************************************************************************************************
            Console.WriteLine("--------复合Select子句查询单个字段---------");
            var reuslt2 = from f in plist//数据源
                          from loveritem in f.lover
                          where loverlist.Contains(loveritem)
                          select f.Name; //复合字句查询,单个字段不是全部字段

            List<string> unamelist = reuslt2.ToList();

            foreach (var item in unamelist)
            {
                Console.WriteLine(item);
            }
            //***************************************************************************************************************************************
            Console.WriteLine("--------复合Select子句查询多个字段:---------");
            var reuslt3 = from f in plist//数据源
                          from loveritem in f.lover
                          where loverlist.Contains(loveritem)
                          select new
                          { //复合字句查询,多字段
                              a = f.Id,
                              b = f.Name,
                              c = f.Price
                          };

            foreach (var item in reuslt3)
            {
                Console.WriteLine("编号:{0},产品名:{1},价格:{2}", item.a, item.b, item.c);
            }


            Console.ReadLine();//用来暂定
        }
    }

    /// <summary>
    /// 实体类,网上没有太多解释,我认为解释处理数据的一个载体,prop快速生成字段
    /// </summary>
    public partial class Product
    {
        //构造方法:与类同名,且没有返回值。作用:初始化类的成员。运行时:创建对象(new)的时候就会执行构造方法
        /// <summary>
        /// 有参构造方法:这种写发相当于 调用时候 new Product(){}对象  一般用作初始化值 可以这样,调用的时候赋值给他  new Product(1,"洗衣机",999,"格力","B301")
        /// </summary>
        public Product(int Id, string Name, int Price, string Brand, string Sell)
        {
            this.Id = Id;
            this.Name = Name;
            this.Price = Price;
            this.Brand = Brand;
            this.Sell = Sell;
        }
        /// <summary>
        /// 无参构造方法:每个类默认都是有一个“无参构造”,但是类中定义了其他构造,默认的无参构造将不存在,因此必须重新在写一次,说明了构造方法是可以方法重载的。
        /// </summary>
        public Product()
        {
            Console.WriteLine("方法重载:同一个类中【只要方法名相同,参数列表不同】,不关心其他因素,不管有没有返回值都叫方法重载。");
        }
        ~Product()
        {
            Console.WriteLine("析构方法:与类同名,语法 ~类名(){}的方法,不需要被调用。运行时:在类被实例化对象,完成一系列操作后,会执行析构方法里面的代码");
        }

        public Nullable<int> Id { get; set; } //Nullable<int>表示值类型也可以赋空值  int? id = null 就不会不错  一般来说int是没有空值 string有
        public string Name { get; set; }
        public int? Price { get; set; } // int?  是 Nullable<int> 的简化 ,不限制值类型,其他类型也可以用 除了字符串本身就可以有空值外加他没意义
        public string Brand { get; set; }
        public string Sell { get; set; }



    }
    /// <summary>
    /// 分部类:关键字 partial【部分】的意思,对应的类名要一样,指定其实就是一个类了
    /// 作用:一个类分成几个来写,最终合并到一起,在asp.net经常看到,对我们代码太多一个类写不下来,就会用 partial 把多类合并起来
    /// </summary>
    public partial class Product
    {
        public List<string> lover { get; set; }//调用Product类时就可以使用上面字段也可以使用这个字段,都是同一个类,是合并类
    }
}
原文地址:https://www.cnblogs.com/longxinyv/p/14439088.html