let 子句位于 from 和 select 之间,用于引入一个新的范围变量,存储对当前行(或分组后每组数据)的计算结果,供后续 where、select 等子句复用。
非分组查询中使用 let
对单行数据的列进行计算或组合,存储到临时变量中:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<Singer> list = new List<Singer>(){
new Singer{Name="张三", Age=21},
new Singer{Name="李四", Age=25},
new Singer{Name="王五", Age=21}
};
var query = from a in list
let b = a.Name + a.Age // 组合姓名和年龄
let c = a.Age // 提取年龄
where b == "张三21" && c >= 21
select a;
foreach (var item in query)
{
Console.WriteLine("姓名: " + item.Name + " 年龄:" + item.Age);
}
Console.ReadLine();
}
private class Singer
{
public int Age { get; internal set; }
public string Name { get; internal set; }
}
}
}Code language: JavaScript (javascript)
说明:
let b = a.Name + a.Age把姓名和年龄拼接后存入b,后续where中可以直接引用b和c,避免重复计算。
分组查询中使用 let
分组后,对每组内的数据做二次处理(如拼接、提取列表等):
using (var db = new DataClasses1DataContext())
{
var q = from s in db.Student
group s by s.sex into g
let info = g.Select(m => m.name + ":" + m.age) // 每组内拼接姓名和年龄
select new
{
sex = g.Key,
count = g.Count(),
msg = string.Join(",", info) // 合并为一条字符串
};
var list = q.ToList();
}Code language: JavaScript (javascript)
输出效果示意:
| sex | count | msg |
|---|---|---|
| 男 | 3 | 张三:20,李四:22,王五:21 |
| 女 | 2 | 赵六:19,孙七:20 |
Previous: 分组后使用 into 保存分组结果
Next: 对 IQueryable 直接调用聚合函数