let 语句的完整用法

let 子句位于 fromselect 之间,用于引入一个新的范围变量,存储对当前行(或分组后每组数据)的计算结果,供后续 whereselect 等子句复用。


非分组查询中使用 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 中可以直接引用 bc,避免重复计算。


分组查询中使用 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)

输出效果示意:

sexcountmsg
3张三:20,李四:22,王五:21
2赵六:19,孙七:20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注