Unity中使用Azure:如何创建查询及筛选数据库调用?
Azure Tables Unity 查询筛选实操指南
嘿,恭喜你已经搞定Azure Tables的增删改操作了!关于查询筛选这部分,其实CreateQuery方法搭配Linq语法就能轻松上手,我给你拆解几个最常用的场景,直接套到Unity里就行:
1. 基础查询结构
首先你得先拿到CloudTable实例(比如你已经初始化好的游戏玩家表),然后通过CreateQuery<T>创建查询对象,再用Where添加筛选条件,最后执行查询就行。这里的T是你的实体类,必须继承TableEntity哦。
示例框架代码:
// 假设你已经有了CloudTable实例(比如叫_playerTable) var baseQuery = _playerTable.CreateQuery<PlayerEntity>(); // 给查询加筛选条件 var filteredQuery = baseQuery.Where(entity => entity.PartitionKey == "US_Server" && entity.Level > 15); // Unity里建议用异步执行,避免卡主线程 var queryResults = await filteredQuery.ExecuteQueryAsync();
2. 按Id(PartitionKey/RowKey)筛选
Azure Tables的主键是PartitionKey+RowKey,查这两个字段效率最高,也是最常用的筛选方式:
精确匹配单个实体
如果你知道完整的PartitionKey和RowKey,用TableOperation.Retrieve其实更高效,但如果非要用CreateQuery的话:
var singlePlayerQuery = _playerTable.CreateQuery<PlayerEntity>() .Where(e => e.PartitionKey == "PlayerGroup_03" && e.RowKey == "Player_67890"); // 取第一个匹配结果,没有的话返回null var targetPlayer = (await singlePlayerQuery.ExecuteQueryAsync()).FirstOrDefault();
筛选同一分区下的所有实体
var groupPlayersQuery = _playerTable.CreateQuery<PlayerEntity>() .Where(e => e.PartitionKey == "PlayerGroup_03"); var allPlayersInGroup = await groupPlayersQuery.ExecuteQueryAsync();
3. 按字符串字段筛选
如果要按普通字符串列(比如玩家昵称、角色职业)筛选,支持精确匹配、模糊包含、前缀匹配等:
精确匹配字符串
// 筛选昵称等于"Fabrizio"的玩家 var exactMatchQuery = _playerTable.CreateQuery<PlayerEntity>() .Where(e => e.Nickname == "Fabrizio"); var matchedPlayers = await exactMatchQuery.ExecuteQueryAsync();
字符串模糊包含
Azure Tables的Contains对应OData的substringof,用来做模糊匹配:
// 筛选昵称里包含"riz"的玩家 var containMatchQuery = _playerTable.CreateQuery<PlayerEntity>() .Where(e => e.Nickname.Contains("riz")); var matchedPlayers = await containMatchQuery.ExecuteQueryAsync();
字符串前缀匹配
用StartsWith找以特定字符开头的字符串:
// 筛选昵称以"Fab"开头的玩家 var prefixMatchQuery = _playerTable.CreateQuery<PlayerEntity>() .Where(e => e.Nickname.StartsWith("Fab")); var matchedPlayers = await prefixMatchQuery.ExecuteQueryAsync();
4. 组合多条件筛选
可以同时叠加多个筛选条件,比如结合分区、等级和字符串字段:
var complexQuery = _playerTable.CreateQuery<PlayerEntity>() .Where(e => e.PartitionKey == "EU_Server" && e.Level >= 25 && e.Job == "Warrior"); var qualifiedPlayers = await complexQuery.ExecuteQueryAsync();
几个小提醒
- 确保你的实体类字段和Azure Table里的列名完全一致,或者用
[JsonProperty("ColumnName")]标注映射关系; - Unity里执行异步操作时,记得用
async/await,如果是在MonoBehaviour里,方法可以写成async void或者用协程包装; - 复杂查询优先按
PartitionKey筛选,能大幅提升查询效率,因为Azure Tables是按分区存储的。
内容的提问来源于stack exchange,提问作者Spoonshoe
相关产品推荐
相关产品推荐

