from 语法
要写一个Linq表达式必须要以from开头。
不说废话,先看例子:
一、简单的from查询
1.首先,建立一个控制台应用程序名字为:DemoFrom_1
注意引入System.Core
2.在Program.cs 输入以下语句
class Program
{
static void Main(string[] args)
{
// 定义数据源
// string 是实现了IEnumerable接口的,所以可以使用用Linq查询
string[] values = { "刘备", "诸葛亮","关羽", "张飞" };
// Linq 查询
var value = from v in values where v.Length > 2 select v;
foreach (var n in value)
Console.WriteLine(n);
Console.ReadKey();
}
}
3.运行程序,得到以下结果
讲解:
var value = from v in values where v.Length > 2 select v;
在Linq的表达式中,v是范围变量(作用域为当前Linq表达式中)。values是数据源变量。where 用来筛选数据源元素。select 输出元素。
在该例子中,从数据源(values)中筛选(where)长度大于2(v.Length > 2 )的元素。并且输出符合的元素,赋给变量value。这时,value中
为符合条件的数据。后面,用foreach 输出。
Linq查询,还是简单吧。不要眨眼,往下接着看。
二、查询自定义类
有时候,我们需要从自定义类中查询我们需要的数据。
1.我们在项目中添加类文件:GuestInfo.cs。代码如下:
/// <summary>
/// 客户信息类
/// </summary>
public class GuestInfo
{
/// <summary>
/// 姓名
/// </summary>
public string Name { set; get; }
/// <summary>
/// 年龄
/// </summary>
public int Age { set; get; }
/// <summary>
/// 电话
/// </summary>
public string Tel { set; get; }
/// <summary>
/// 电话列表
/// </summary>
public List<string> TelList { set; get; }
}
2.将Program.cs,做如下修改:
static void Main(string[] args)
{
//初始化集合
List<GuestInfo> gList = new List<GuestInfo>()
{
new GuestInfo {
Name = "张三",
Age = 21,
Tel="111111",
TelList = new List<string>(){
"123123",
"321321"}
},
new GuestInfo {
Name = "李四",
Age = 36,
Tel="222222",
TelList = new List<string>(){
"456456",
"654654"}
},
new GuestInfo {
Name = "王五",
Age = 19,
Tel="333333",
TelList = new List<string>(){
"789789",
"987987"}
},
};
//查找 年龄大于20,并且电话号码列表中包含“456456”的客户
// 第一个from 查询出年龄大于20的客户,并存放到范围变量guest中
// 第二个from 从范围变量guest中查询出电话列表中包含“456456”的客户数据
// 查询出符合的客户信息 select guest;
var query = from GuestInfo guest in gList
where guest.Age > 20
from tel in guest.TelList
where tel.IndexOf("456456") > -1
select guest;
//输出 客户数据
foreach (var g in query)
{
Console.WriteLine(string.Format("{0} 年龄:{1}", g.Name, g.Age));
foreach (var t in g.TelList)
Console.WriteLine(string.Format(" 电话:{0}", t));
}
Console.WriteLine("*************************************************");
Console.ReadKey();
}
3.输出为:
三、笛卡尔两个查询集合
1.在Program.cs中添加如下代码:
// 笛卡尔两个集合数据
//初始化集合
List<GuestInfo> gList_1 = new List<GuestInfo>()
{
new GuestInfo {
Name = "赵六",
Age = 21,
Tel="111111",
TelList = new List<string>(){
"111111",
"321321"}
}
};
// 第一个from 查询出年龄大于20的客户,并存放到范围变量guest中
// 第二个from 查询出电话列表中包含“111111”的客户,存放在范围变量guest1中
// 联合两个查询结果 select new {guest,guest1 };
var query_1 = from GuestInfo guest in gList
where guest.Age > 20
from GuestInfo guest1 in gList_1
where guest1.TelList.IndexOf("111111") > -1
// 交叉联接查询,即两个结果的笛卡尔集
select new {guest,guest1 };
//输出 客户数据
foreach (var g in query_1)
{
Console.WriteLine(string.Format("{0}-{1}", g.guest.Name,g.guest1.Name));
}
Console.WriteLine("*************************************************");
foreach(var g in query_1)
{
// guest 中的数据
Console.WriteLine(string.Format("{0} 年龄:{1}", g.guest.Name, g.guest.Age));
foreach (var t in g.guest.TelList)
Console.WriteLine(string.Format(" 电话:{0}", t));
// guest1 中的数据
Console.WriteLine(string.Format("{0} 年龄:{1}", g.guest1.Name, g.guest1.Age));
foreach (var t in g.guest1.TelList)
Console.WriteLine(string.Format(" 电话:{0}", t));
}
Console.ReadKey();
2.输出结果:
是不是很简单,可见,Linq还是蛮有趣的呢。呵呵!学习中!