记一个C#运用MongoDb的关键字“where“

示例场景

假设我们有一个Product实体,包含产品ID和库存数量两个字段,需要查询特定产品且在指定库存范围内的记录。

C#表达式树结构差异

第一种方法:Where表达式

var stockFilter = Builders<Product>.Filter.Where(product =>
  product.ProductId == targetId
  && product.StockQuantity >= minStock
  && product.StockQuantity <= maxStock);

表达式树特征:

完整的Lambda表达式树结构
编译器生成包含逻辑运算节点的表达式树
类型系统完全介入,进行编译时验证

第二种方法:Filter构建器组合

var stockFilter2 = Builders<Product>.Filter.And(
  Builders<Product>.Filter.Eq(product => product.ProductId, targetId),
    Builders<Product>.Filter.Gte(product => product.StockQuantity, minStock),
      Builders<Product>.Filter.Lte(product => product.StockQuantity, maxStock)
        );

表达式树特征:

多个独立的方法调用表达式
每个条件独立构建,通过And方法显式组合
表达式的嵌套层次较浅

生成的MongoDB查询语句

第一种

{
"ProductId": "指定的产品ID值",
"StockQuantity": {
"$gte": 最小库存值,
"$lte": 最大库存值
}
}

第二种

{
"$and": [
{ "ProductId": "指定的产品ID值" },
{ "StockQuantity": { "$gte": 最小库存值 } },
{ "StockQuantity": { "$lte": 最大库存值 } }
]
}

主要区别:
查询结构:第一种通常生成更简洁的文档结构,第二种显式使用$and操作符
字段引用:第二种方法中相同字段的条件作为数组元素独立存在(第二种更接近与mongoDb原生语句)

编译与执行特性对比

类型安全性
两种方式都提供编译时类型检查,但实现机制不同:

方法一:依赖C#的表达式树类型检查和编译

// 如果Product没有StockQuantity字段,编译时会报错
product => product.StockQuantity >= minStock

posted @ 2026-03-04 22:00  clnchanpin  阅读(10)  评论(0)    收藏  举报