You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ServiceStack.Redis按字段值查询Redis中CompanyList类数据

嘿,我来帮你搞定这个问题!用ServiceStack.Redis查询CompanyList类里Expediente字段等于100037的数据,核心是要利用Redis的索引能力,或者借助ServiceStack自带的特性,下面给你几种可行的方案,从高效到简单逐一说明:

方案一:提前创建二级索引(推荐,高效查询)

Redis本身是键值存储,没有原生的字段查询能力,所以要高效定位特定字段值的数据,最好提前给Expediente字段建立索引。存储数据时同步维护索引,查询时就能快速定位。

存储数据时同步建索引

当你保存CompanyList对象到Redis时,额外把Expediente的值和对象ID关联起来,用Redis的Set结构来存储相同Expediente对应的所有对象ID:

using (var redis = new RedisClient("你的Redis地址"))
{
    // 实例化要存储的CompanyList对象
    var targetCompany = new CompanyList 
    { 
        Id = "company_001", 
        Expediente = "100037", 
        // 其他字段赋值...
    };

    // 把对象存入Redis
    redis.As<CompanyList>().Store(targetCompany);

    // 建立Expediente到对象ID的索引:键名格式建议用`idx:类名:字段名:字段值`
    redis.AddItemToSet($"idx:CompanyList:Expediente:{targetCompany.Expediente}", targetCompany.Id);
}

基于索引查询数据

查询时先通过索引获取匹配的对象ID,再根据ID拉取完整对象:

using (var redis = new RedisClient("你的Redis地址"))
{
    // 从索引中获取Expediente=100037的所有CompanyList对象ID
    var matchingIds = redis.GetAllItemsFromSet($"idx:CompanyList:Expediente:100037");

    // 根据ID批量获取完整对象
    var matchingCompanies = redis.As<CompanyList>().GetByIds(matchingIds);

    // matchingCompanies就是你要的目标数据啦
}
方案二:用ServiceStack的Linq查询(简化操作)

ServiceStack.Redis支持Linq语法查询,底层会自动利用已有的索引(如果有的话),没有索引时会在客户端过滤(数据量大时不推荐)。

代码示例:

using (var redis = new RedisClient("你的Redis地址"))
{
    var redisCompanyRepo = redis.As<CompanyList>();
    
    // 直接用Linq过滤Expediente字段
    var matchingCompanies = redisCompanyRepo.Where(c => c.Expediente == "100037").ToList();
}

注意:如果没提前建索引,这个查询会把所有CompanyList数据拉到本地再过滤,数据量大时速度会很慢,所以还是优先用方案一。

方案三:手动遍历所有数据(仅小数据量可用)

如果你的CompanyList数据量极小,也可以直接拉取所有数据后在本地过滤,但这种方法效率极低,数据多的时候千万别用:

using (var redis = new RedisClient("你的Redis地址"))
{
    // 拉取所有CompanyList数据
    var allCompanies = redis.As<CompanyList>().GetAll();
    
    // 本地过滤出Expediente=100037的数据
    var matchingCompanies = allCompanies.Where(c => c.Expediente == "100037").ToList();
}

额外注意事项

  • 更新或删除CompanyList对象时,要同步更新对应的索引,比如删除对象时,要从对应的Expediente索引Set中移除该对象的ID,避免数据不一致。
  • ServiceStack.Redis的As<T>()方法会自动处理对象的序列化(默认JSON),对象的Id属性会作为Redis存储的键名(比如urn:companylist:company_001)。

内容的提问来源于stack exchange,提问作者Hector Hernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:33:31