LINQ是Microsoft推出的新一代数据查询语言。
LINQ作用:可以将数据查询直接集成到编程语言本身中。可以解决处理非常大的数据集合的问题。
LINQ还提供了许多扩展方法,更便于排序、组合和计算查询结果的统计数据。
使用LINQ可以查询C#中许多不同的数据源,包括对象、SQLXML、实体数据
语法:
string[] names = { "Alonso", "zheng", "Smith", "Jones", "Smythe", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" }; var queryResults = from n in names where n.StartsWith("S") select n; foreach (var item in queryResults) { Console.WriteLine(item); } Console.ReadKey(); }
from是指定数据源。n相当于foreach后面的变量。where表示查询条件,可省略。
select字句指定结果集中包含哪些元素。
查询语法是在LINQ中编写查询的首选方式,但是方法语法同样需要了解。
string[] names = { "Alonso", "zheng", "Smith", "Jones", "Smythe", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" }; var queryResults = names.Where(n => n.StartsWith("s")); //以s开头 foreach (var item in queryResults) { Console.WriteLine(item); } Console.ReadKey(); }
排序查询结果
用where找到了需要的数据后,LINQ还可以方便地对得到的数据执行进一步处理。
只需在语句中加上
orderby n
就能根据首字母进行升序排序。如需进行降序排序
orderby n descending
当然,也可以按照任意表达式进行排序,而不必重新编写查询。
例:按照名字中最后一个字母来排序。
orderby n.Substring(n.Length - 1);
用方法语法排序同样很简单
names.orderby(n => n);
LINQ还提供了聚合运算符,对结果集进行操作。
Count()//计数 Min(), Max(), Average() Sum();
投影:在查询中创建新对象
投影是在LINQ中从其他数据类型中创建新数据类型的技术术语。在select中,可以选择某个对象的字段,而不是整个对象。
例如:select c.City.
但是,与SQL不同,LINQ不允许在select子句中有多个字段。例如select c.City,c.Country这样是不允许的。
这时,可以创建一个对象,像这样
select new{c.City,c.Country,c.Sales}
单值选择查询
跟sql中一样,去除重复值。
var queryResults = customers.Select(c => c.Region).Distinct();
Any() 和 All() 方法。
我们常常需要的另一类查询是确定数据是否满足某个条件,或者确保所有数据都满足条件。
bool anyUSA = customers.Any(c => c.Country == "USA");
Any是确定数据中是否有数据满足条件。all是确定数据中是否全部满足条件。
当然,有时候我们会需要返回实际的数据,而并不是true和false。那么可以用
First()和FirstOrDefault()方法。用于返回匹配的第一个数据,
FirstOrDefault()即是为空也不会抛出异常。
queryResults.FirstOrDefault(c => c.Regin == "re");
多级排序:
有时候按一个字段来进行排序是满足不了需求的。这时候可以用到多级排序。
var queryResults = from c in customers orderby c.Region,c.COuntry,c.City select new {c.ID,c.Region}
在方法语法中:
var queryResults = customers.OrderBy(c => c.Region) .ThenBy(c => c.Country) .ThenBy(c => c.City) .select(c => new{c.ID,c.Region,c.Country})
Take() 和Skip() 方法
Take相当于sql中的top。返回前几名的数据。Skip()与Take相反。
返回剩余的数据。
可以这样写:
foreach(var item in queryResults.Take(5)){ }
Join 查询 可以用一个查询搜索两个列表中相关的数据,用键字段把结果连接起来。
var queryResults = from c in customers join o in orders on c.ID equals o.ID select new{c.ID,c.City,}
LINQ to XML
1.LINQ to XML函数构造方式
XDocument xdoc = new XDocument( new XElement("customers", new XElement("customers", new XAttribute("ID", "A"), new XAttribute("City", "New York"), new XAttribute("Region", "North America"), new XElement("order", new XAttribute("Item", "Tire") ) ), new XElement("customer") ) );
还可以通过字符串的方式创建
XDocument xdoc = XDocument.Parse(@"<customers>.....</customers>")