LINQ查询表达式---------from子句

LINQ查询表达式---------from子句

LINQ的查询由3基本部分组成:获取数据源,创建查询,执行查询

//1、获取数据源
List<int> scores = new List<int> { 97, 92, 80, 81, 79, 54 };

//创建查询
var scoreeQuery =
    from score in scores
    where score > 80
    select score;

//3、执行查询
foreach (int i in scoreeQuery)
{
    Console.WriteLine("{0}", i);
}

1.1 单个from子句

string[] values = { "张三", "李四", "王五", "大王", "小王" };
//查询所有包含“王”字的字符串
var valuesQuery = from v in values
                  where v.IndexOf("") > -1
                  select v;
foreach (string s in valuesQuery)
{
    Console.WriteLine(s);
}
输出结果:
    王五
    大王
    小王
在这个LINQ表达式的from子句中,v叫做范围变量,values是数据源。v的作用域存在于当前的LINQ表达式,表达式以外不能访问这个变量。where用来筛选元素,select用于输出元素

 

1.2 复合from子句

public void ExpDemo()
{
    List<PerInfo> listPer = new List<PerInfo>
    {
        new PerInfo{
            Name = "小白",
            Age = 19,
            Tel = new List<string>{"1535010****", "153****8523"}
        },
        new PerInfo{
            Name = "小新",
            Age = 21,
            Tel = new List<string>{"1330708****", "1330709****"}
        },
        new PerInfo{
            Name = "小军",
            Age = 23,
            Tel = new List<string>{"1380524****", "1380525****"}
        }
    };

    var query = from PerInfo p in listPer
                from listTel in p.Tel
                where listTel.IndexOf("1535010****") > -1
                select p;

    foreach (var q in query)
    {
        Console.WriteLine("姓名:{0};年龄:{1}", q.Name, q.Age);
        foreach (var tel in q.Tel)
        {
            Console.WriteLine("电话:{0}", tel);
        }
    }
}

public class PerInfo
{
    public string Name
    {
        get;
        set;
    }
    public int Age
    {
        get;
        set;
    }
    public List<string> Tel
    {
        get;
        set;
    }
}
输出结果:
姓名:小白;年龄:19
电话:1535010****
电话:153****8523 
在查询数据源中,属性是一个集合时,可以使用复合from子句对这个属性集合查询。比如,一个人,可能有多个手机号。

 

1.3 多个from子句连接 

static void Main(string[] args)
{
    //1.3 使用多个from子句执行联结
    List<PerInfo> listPer1 = new List<PerInfo>
    {
        new PerInfo{
            Name = "小白",
            Age = 19,
            Tel = new List<string>{"1535010****"}
        },
        new PerInfo{
            Name = "小新",
            Age = 21,
            Tel = new List<string>{"1330708****"}
        },
        new PerInfo{
            Name = "小军",
            Age = 23,
            Tel = new List<string>{"1380524****"}
        }
    };

    List<PerInfo> listPer2 = new List<PerInfo>
    {
        new PerInfo{
            Name = "小日",
            Age = 25,
            Tel = new List<string>{"1535010****"}
        },
        new PerInfo{
            Name = "小月",
            Age = 26,
            Tel = new List<string>{"1330708****"}
        },
        new PerInfo{
            Name = "小明",
            Age = 27,
            Tel = new List<string>{"1380524****"}
        }
    };


    var query1 = from lp1 in listPer1
                 from lp2 in listPer2
                 select new { lp1, lp2 };

    foreach (var s in query1)
    {
        Console.WriteLine("{0}  {1} ", s.lp1.Name, s.lp2.Name);
    }

    Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++");

    var query2 = from lp1 in listPer1
                 where lp1.Age > 20
                 from lp2 in listPer2
                 where lp2.Age > 25
                 select new{ lp1, lp2};

    foreach (var s in query2)
    {
        Console.WriteLine("{0}  {1} ", s.lp1.Name, s.lp2.Name);
    }

    Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++");

    var query3 = from lp1 in listPer1
                 from lp2 in listPer2
                 where lp2.Age > 25
                 select new{lp1, lp2 };

    foreach (var s in query3)
    {
        Console.WriteLine("{0}  {1} ", s.lp1.Name, s.lp2.Name);
    }

    Console.ReadLine();
}
输出结果:
小白  小日
小白  小月
小白  小明
小新  小日
小新  小月
小新  小明
小军  小日
小军  小月
小军  小明
+++++++++++++++++++++++++++++++++++++++++++
小新  小月
小新  小明
小军  小月
小军  小明
+++++++++++++++++++++++++++++++++++++++++++
小白  小月
小白  小明
小新  小月
小新  小明
小军  小月
小军  小明
复合 from 子句用于访问单个数据源中的内部集合。 不过,查询还可以包含多个可从独立数据源生成补充查询的 from 子句。 使用此技术可以执行某些类型的、无法通过使用 join 子句执行的联接操作。
原文地址:https://www.cnblogs.com/haibing0107/p/6484022.html