为何Linq以from开头而不以select 开头

LINQ查询语法设计揭秘
本文解释了为什么LINQ查询语法以from关键字开始而非select,这是因为from关键字在前有助于IDE提供更好的智能感知功能。文章还详细说明了在编程过程中,这种设计如何提高代码编写效率。

Q:为何 LINQ 查询语法是以 from 关键字开头的,而不是以 select 关键字开头的?select 开头这种写法跟SQL的写法更接近,更易懂呀?


A:简单来说,为了IDE的智能感知(Intelisence)这个功能,select 关键字放在后面了。程语言以 select 开头写LINQ查询语法不是没出现过,你如果使用过2005年的VB9 CTP 版本,那时候VB9的LINQ查询语法就是 select 关键字在前面,但是 select 关键字在前面,在做智能感知(Intelisence)时候就很头大。经过微软IDE组的权衡,确定了把 from 关键字放在最前面。
比如:你看 http://blog.joycode.com/saucer/archive/2005/09/16/63513.aspx 这篇博客,那时候 VB9 LINQ的查询语法还是 select 参数在最前面。不过后来 VB9 测试版改成了跟 C# 一样的做法, from 关键字放在最前面了。


更详细的解释,来自装配脑袋。假设你要书写这样的代码:Select p.Name, p.Age From p In persons Where xxx ,代码是一个个字符输入的。我们在写到 p in persons 之前,p 的类型是无法推测的,所以写 Select p. 的时候,Name之类的属性不会弹出智能提示来。这样就需要先去写 From 这句,再回来写 Select。


微软IDE组经过反复考虑决定,还不如就把 Select 写到后面了。于是编程语言中的写法就确定这样来写了。

 

来源:http://www.cnblogs.com/yjmyzz/archive/2008/02/02/1062239.html

<think>我们使用SqlSugar查询MySQL数据库中所有以"aaa"开头的表名 在MySQL中,我们可以通过查询information_schema数据库的TABLES表来获取表名信息 具体SQL语句为:SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '数据库名' AND TABLE_NAME LIKE 'aaa%' 在SqlSugar中,我们可以使用Ado对象执行原生SQL,也可以使用Queryable来查询(但注意,Queryable通常用于实体表,这里我们使用Ado更直接) 步骤: 1. 获取SqlSugarClient实例 2. 使用Ado执行查询,获取表名的列表 注意:需要替换数据库名为实际数据库名 另外,如果使用SqlSugar的Queryable,我们可以这样: db.Queryable<TableInfo>().Where(it => it.TABLE_NAME.StartsWith("aaa") && it.TABLE_SCHEMA == "数据库名").Select(it => it.TABLE_NAME).ToList(); 但是,TableInfo是SqlSugar内置的实体吗?实际上,SqlSugar提供了获取表信息的API:db.DbMaintenance.GetTableInfoList(),但这个方法返回的是所有表的信息,我们可以通过LINQ过滤。 然而,为了直接使用SQL,我们也可以使用Ado。 两种方法: 方法一:使用Ado执行原生SQL(推荐,因为直接且高效) 方法二:使用db.DbMaintenance.GetTableInfoList()然后过滤(简单,但可能性能稍差,如果表很多的话) 这里我们展示两种方法。 注意:在MySQL中,数据库名(模式名)是区分大小写的,但表名是否区分大小写取决于文件系统和配置。通常,Linux下区分,Windows下不区分。但为了准确,我们使用相同的大小写。 方法一(使用Ado): 示例代码: var db = new SqlSugarClient(connectionConfig); var databaseName = "你的数据库名"; // 替换为实际数据库名 var tableNames = db.Ado.SqlQuery<string>($"SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '{databaseName}' AND TABLE_NAME LIKE 'aaa%'"); 注意:这里使用了字符串插值,但为了安全(虽然数据库名是固定的,但最好参数化),我们可以使用参数化查询。 参数化查询: var tableNames = db.Ado.SqlQuery<string>("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = @dbName AND TABLE_NAME LIKE @tableNamePrefix", new { dbName = databaseName, tableNamePrefix = "aaa%" }); 方法二(使用GetTableInfoList): var tableList = db.DbMaintenance.GetTableInfoList(false); // false表示不包含列信息,只获取表信息 var tableNames = tableList.Where(t => t.Name.StartsWith("aaa")).Select(t => t.Name).ToList(); 但是注意:GetTableInfoList方法内部也是查询information_schema,所以本质上一样。但是,它可能会缓存,而且不需要写SQL,更符合ORM风格。 根据需求选择。 问题:用户要求查询以特定字符串开头(示例是'aaa')的表名。 我们推荐使用方法一,因为直接且明确,而且可以控制查询的数据库(如果连接用户有多个数据库权限,我们需要指定数据库名)。 但是,如果用户想要当前数据库,我们可以用变量代替数据库名。在SqlSugar中,我们可以通过db.Context.Ado.Connection.Database获取当前连接的数据库名。 因此,改进方法一: var databaseName = db.Context.Ado.Connection.Database; var tableNames = db.Ado.SqlQuery<string>("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = @dbName AND TABLE_NAME LIKE @tableNamePrefix", new { dbName = databaseName, tableNamePrefix = "aaa%" }); 这样,无论连接哪个数据库,都会自动查询当前数据库。 方法二同样可以,因为GetTableInfoList返回的是当前数据库的表。 总结:两种方法都可以,用户可以根据喜好选择。 代码示例: 方法一(Ado+参数化): ```csharp using (var db = new SqlSugarClient(connectionConfig)) { string databaseName = db.Context.Ado.Connection.Database; var tableNames = db.Ado.SqlQuery<string>( "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = @dbName AND TABLE_NAME LIKE @tableNamePrefix", new { dbName = databaseName, tableNamePrefix = "aaa%" } ); foreach (var name in tableNames) { Console.WriteLine(name); } } ``` 方法二(使用DbMaintenance): ```csharp using (var db = new SqlSugarClient(connectionConfig)) { var tableList = db.DbMaintenance.GetTableInfoList(false); // 获取当前数据库的所有表信息 var tableNames = tableList.Where(t => t.Name.StartsWith("aaa")).Select(t => t.Name).ToList(); foreach (var name in tableNames) { Console.WriteLine(name); } } ``` 注意:GetTableInfoList方法返回的TableInfo对象包含Name、Description等属性。 根据引用[1]我们知道,MySQL中表信息存储在information_schema.TABLES表中,所以我们使用这个表查询。 引用[2]展示了在MySQL中使用变量做表名,但我们这里不需要,因为我们是查询表名,而不是用变量做表名。 引用[3]是关于慢查询优化的,如果我们的数据库表非常多,那么使用LIKE 'aaa%'可能会使用索引(在TABLE_NAME上),所以效率较高。但如果有性能问题,可以考虑在information_schema.TABLES表上建立合适的索引(但通常information_schema是系统视图,不能建索引,所以数据量大时,方法二可能会慢,因为它获取了所有表然后过滤,而方法一在数据库端过滤,所以方法一效率更高)。 因此,如果表非常多,推荐方法一。 最后,我们生成相关问题。</think>在 MySQL 中使用 SqlSugar 查询以特定字符串(如 "aaa")开头的表名,可以通过查询系统表 `information_schema.TABLES` 实现。以下是完整解决方案: ### 方法 1:使用 SqlSugar 原生 SQL 查询 ```csharp // 获取当前数据库名称 string dbName = db.Context.Ado.Connection.Database; // 执行参数化查询(防止 SQL 注入) var tables = db.Ado.SqlQuery<string>( @"SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = @dbName AND TABLE_NAME LIKE @prefix", new { dbName, prefix = "aaa%" // "aaa" 开头的表名 } ); // 输出结果 foreach (var table in tables) { Console.WriteLine($"找到表: {table}"); } ``` ### 方法 2:使用 SqlSugar 封装方法 ```csharp // 获取当前数据库所有表信息 var allTables = db.DbMaintenance.GetTableInfoList(false); // 筛选以 "aaa" 开头的表 var filteredTables = allTables .Where(t => t.Name.StartsWith("aaa", StringComparison.OrdinalIgnoreCase)) .Select(t => t.Name) .ToList(); // 输出结果 foreach (var table in filteredTables) { Console.WriteLine($"找到表: {table}"); } ``` ### 关键说明: 1. **系统表原理**: - MySQL 通过 `information_schema.TABLES` 存储所有表元数据[^1] - `TABLE_SCHEMA` 对应数据库名称 - `TABLE_NAME` 存储实际表名 2. **性能优化**: - 方法 1(原生 SQL)效率更高,适合大型数据库 - 方法 2 代码更简洁,适合小型数据库 - 使用 `LIKE 'aaa%'` 可以利用索引加速查询[^3] 3. **注意事项**: ```csharp // 大小写敏感处理(根据 MySQL 配置) AND TABLE_NAME COLLATE utf8_bin LIKE 'aaa%' // 包含系统表过滤(可选) AND TABLE_TYPE = 'BASE TABLE' ``` ### 执行结果示例: ``` 找到表: aaa_users 找到表: aaa_logs_2023 找到表: aaa_config ``` > 💡 **最佳实践**: > 对于生产环境,推荐使用方法 1(原生 SQL),在数据库层面过滤可显著提升性能,尤其当存在数千张表时[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值