LINQ查询

Posted .

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ查询相关的知识,希望对你有一定的参考价值。

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>")

 

以上是关于LINQ查询的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to XML - 从文件加载 XML 片段

错误 3002:映射片段中的问题 | c# linq 到实体

将sql代码转换为linq(内连接查询)

Linq 查询在代码中引发超时,但在 LinqPad 上工作正常

协助将 SQL 查询转换为 LINQ 查询

使用 linq/Entity Framework 查询多对多关系。代码优先