MongoDB学习(翻译2)
C#驱动之LINQ教程
介绍
本教程涵盖了1.8发布版本对linq查询的支持。
开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍
快速开始
首先,添加下面命名空间到您的程序中:
using MongoDB.Driver.Linq;
然后,声明一变量保存对集合的引用
var collection = database.GetCollection<TDocument>("collectionname");
最基本调用linq查询的方式是构造一个集合变量,通过调用AsQueryable<TDocument>() 后,你便可以正常调用linq了。
实例:
var query =
from e in collection.AsQueryable<Employee>()
where e.FirstName == "John"
select e;
foreach (var employee in query)
{
// do something
}
当然,你也可以通过lambda语法写查询表达式,先前的查询语句等同于下面的写法:
var query =
collection.AsQueryable<Employee>()
.Where(e => e.FirstName == "John");
C#编译器会在内部把所有查询翻译为lambda句法,所以这两种写法没有优略之分,当你需要的时候(比如某些查询操作符不被支持的时候),你甚至可以混用这两种方式。
本教程实例中所有代码均会展示linq查询表达式和lamdba表达式(在查询操作符被支持的前提下).
只有linq查询可以转化为相应的MongoDB查询时该查询才会被支持解析,如果你写的linq查询不能被转化成相应的MongoDB查询,那么您的程序会在产生异常或者错误。
支持的LINQ查询操作符
本节介绍支持的LINQ查询操作符。
- Any
不含谓词的Any只是测试集合中是否存在any文档对象(any直接引用过来,大家都明白)
var result =
(from c in collection.AsQueryable<C>()
select c)
.Any();
// 或者
var result =
collection.AsQueryable<C>()
.Any();
- Any (含谓词)
含有谓词的Any用来测试集合中是否存在匹配的文档,匹配逻辑在谓词中
var result =
(from c in collection.AsQueryable<C>()
select c)
.Any(c => c.X == );
// or
var result =
collection.AsQueryable<C>()
.Any(c => c.X == );
投影操作后,带有谓词的Any是不被支持的(至少当前版本),所以下面代码是不可用的。
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Any(x => x == );
通常来说,你可以使用where字句来替代投影操作,这样你可以移除投影操作。
- Count
不带谓词的Count只是返回文档对象在集合中数量。
var result =
(from c in collection.AsQueryable<C>()
select c)
.Count();
// 或者
var result =
collection.AsQueryable<C>()
.Count();
- Count (带谓词)
带有谓词的Count返回谓词匹配的文档数量。
var result =
(from c in collection.AsQueryable<C>()
select c)
.Count(c => c.X == );
// or
var result =
collection.AsQueryable<C>()
.Count(c => c.X == );
说明:谓词同样可以通过where字句和不带谓词的Count替代,所以上面实例也可以这样写:
var result =
(from c in collection.AsQueryable<C>()
where c.X ==
select c)
.Count();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X == )
.Count();
含有谓词的Count同样不支持投影后操作,所以下面写法是无效的。
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Count(x => x == );
解决方案和Any一样。
- Distinct
Distinct 返回集合中文档对象字段或者属性的唯一值,你可以投影后通过它过滤重复值。
var result =
(from c in collection.AsQueryable<C>()
select c.X)
.Distinct();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Distinct();
投影必须选择一个特定的字段或属性的文件。如果该字段或属性的值是在MongoDB中表示,作为一个数组,你也可以使用数组索引从数据中选择一项:
var result =
(from c in collection.AsQueryable<C>()
select c.A[i])
.Distinct();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.A[i])
.Distinct();
- ElementAt
ElementAt 从结果集中返回一个特定的文档,通常要和排序操作一起使用
var result =
(from c in collection.AsQueryable<C>()
where c.X >
orderby c.X
select c)
.ElementAt(index);
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > )
.OrderBy(c => c.X)
.ElementAt(index);
如果结果集中文档对象数量少于ElementAt 中索引,会报出异常。
- ElementAtOrDefault
ElementAtOrDefault 和ElementAt 类似,区别在于当集合中对象少于Index时前者返回null而不是报出异常。
- First
First 返回集合中第一个对象,通常和排序一起使用。
var result =
(from c in collection.AsQueryable<C>()
where c.X >
orderby c.X
select c)
.First();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > )
.OrderBy(c => c.X)
.First();
如果集合为空,则First抛出异常
- First (含谓词)
此重载允许你提供谓词逻辑给First,相当于使用where字句的first查询。
var result =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.First(c => c.X > );
// or
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.First(c => c.X > );
First (含有谓词)同样不支持投影后操作,所以下面代码是无效的:
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Select(c => c.X)
.First(x => x > );
解决方案同样和Any一样
如果集合为空,同样会抛出异常
- FirstOrDefault
FirstOrDefault 和First 不同之处在于,当集合为空时,不会抛出异常,而是返回null
- FirstOrDefault (含谓词)
FirstOrDefault (含谓词)和First(含谓词)用法一样,不同之处在于,集合为空时,返回null不会抛出异常
- Last
Last 从结果集中返回最后一个文档对象,和First相对,通常和排序操作一起使用:
var result =
(from c in collection.AsQueryable<C>()
where c.X >
orderby c.X
select c)
.Last();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > )
.OrderBy(c => c.X)
.Last();
如果集合为空,会抛出异常。
- Last (含谓词)
此重载允许你传递谓词逻辑作为参数给Last,和不带谓词的Last操作加上where字句相当。
var result =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Last(c => c.X > );
// or
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Last(c => c.X > );
Last 同样不支持投影后操作,所以下面写法是无效的:
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Select(c => c.X)
.Last(x => x > );
解决方案和Any一样。
如果集合为空,会抛出异常
- LastOrDefault
LastOrDefault 和 Last 不同之处在于,前者当集合为空时不会抛出异常,只是返回null
- LastOrDefault (含谓词)
LastOrDefault(含谓词)和 Last (含谓词)用法一样,不同之处在于前者在集合为空时返回null,不会抛出异常。
- LongCount
LongCount 用法和Count 一样,不同之处在于返回值前者是64位长整型,后者是32位。
- LongCount (含谓词)
LongCount (含谓词)和Count (含谓词)用法一样,不同之处在于返回值前者是64位长整型,后者是32位。
- Max
Max 返回集合中文档对象属性或者字段值中的最大值,你可以筛选出投影操作识别出的字段或者属性的最大值
var result =
(from c in collection.AsQueryable<C>()
select c.X)
.Max();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Max();
投影必须选择一个特定的字段或属性的文件。如果该字段或属性的值是在MongoDB中表示,作为一个数组,你也可以使用数组索引从数据中选择一项:
var result =
(from c in collection.AsQueryable<C>()
select c.A[i])
.Max();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.A[i])
.Max();
- Max (含选择器)
此Max 重载可以让你直接传递选择参数到Max来筛选最大值,可以用来代替在投影后进行Max操作:
var result =
(from c in collection.AsQueryable<C>()
select c)
.Max(c => c.X);
// or
var result =
collection.AsQueryable<C>()
.Max(c => c.X);
- Min
Min 返回集合中文档对象属性或者字段值中的最小值,你可以筛选出投影操作识别出的字段或者属性的最小值
var result =
(from c in collection.AsQueryable<C>()
select c.X)
.Min();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Min();
投影必须选择一个特定的字段或属性的文件。如果该字段或属性的值是在MongoDB中表示,作为一个数组,你也可以使用数组索引从数据中选择一项:
var result =
(from c in collection.AsQueryable<C>()
select c.A[i])
.Min();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.A[i])
.Min();
- Min (含选择器)
此Min 重载可以让你直接传递选择参数到Max来筛选最大值,可以用来代替在投影后进行Max操作:
var result =
(from c in collection.AsQueryable<C>()
select c)
.Min(c => c.X);
// or
var result =
collection.AsQueryable<C>()
.Min(c => c.X);
- OfType
OfType操作符会向查询插入一个鉴别器以便你更精确的查询文档对象
var result =
(from c in collection.AsQueryable<C>().OfType<D>()
select c)
// or
var result =
collection.AsQueryable<C>()
.OfType<D>();
- OrderBy
OrderBy 用于指定结果集升序排序顺序
var query =
from c in collection.AsQueryable<C>()
orderby c.X
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X);
- OrderByDescending
OrderByDescending 用于指定结果集降序排序顺序
var query =
from c in collection.AsQueryable<C>()
orderby c.X descending
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderByDescending(c => c.X);
- Select
Select 用于从匹配文档中选出一个新类型的结果集。Select 必须为最后一个操作(除了如 Distinct, Max 和 Min等)
注意:
Select 不会减少从服务器返回的文档对象字段或者属性,完整的文档对象还是会被返回的,然后才调用Select 方法,因此投影是在“客户端”的。
var query =
from c in collection.AsQueryable<C>()
select new { c.X, c.Y };
// or
var query =
collection.AsQueryable<C>()
.Select(c => new { c.X, c.Y });
- Single
Single 从结果集中返回第一个也是唯一的文件
var result =
(from c in collection.AsQueryable<C>()
where c.X >
orderby c.X
select c)
.Single();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > )
.OrderBy(c => c.X)
.Single();
如果结果集为空或者存在多个文档,Single 会抛出异常。
- Single (含谓词)
此重载可以传递参数到Single ,等同于不含谓词的Single 加上where字句。
var result =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Single(c => c.X > );
// or
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Single(c => c.X > );
Single 同样不支持投影后操作,所以下面代码是无效的:
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Select(c => c.X)
.Single(x => x > );
解决方案和Any一样。
如果结果集为空或者存在多个文档,Single 会抛出异常
- SingleOrDefault
SingleOrDefault 和Single 用法一样,不同之处在于当集合为空或者存在多个文档对象时,会返回null,而不是抛出异常。
- SingleOrDefault (含谓词)
SingleOrDefault(含谓词) 和Single (含谓词)用法一样,不同之处在于当集合为空或者存在多个文档对象时,会返回null,而不是抛出异常。
- Skip
使用Skip ,指定从结果集开始跳过多少文件。通常情况下,你将结合排序操作使用。
var query =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Skip();
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Skip();
- Take
使用Take 指定多少文件从服务器返回。结合Skip 使用时,往往你会指定一个排序顺序。
var query =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Skip()
.Take();
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Skip()
.Take();
- ThenBy
ThenBy 是用来指定一个额外的升序排序的结果集。
var query =
from c in collection.AsQueryable<C>()
orderby c.X, c.Y
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.ThenBy(c => c.Y);
- ThenByDescending
ThenByDescending 是用来指定一个额外的降序排序的结果集。
var query =
from c in collection.AsQueryable<C>()
orderby c.X, c.Y descending
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.ThenByDescending(c => c.Y);
- Where
WHERE子句用于指定返回满足条件查询结果。 WHERE子句是将表达查询文档类型映射到一个布尔值句法。如果表达式返回true则结果匹配到结果集中。
var query =
from c in collection.AsQueryable<C>()
where c.X >
select c;
// or
var query =
collection.AsQueryable<C>()
.Where(c => c.X > );
有时也可以使用多个where字句,其左右相当于&&操作符
例如,下面的查询是等价的:
var query =
(from c in collection.AsQueryable<C>()
where c.X >
where c.Y > )
.First(c.Z > );
// or
var query =
(from c in collection.AsQueryable<C>()
where c.X > && c.Y > && c.Z > )
.First();
先到此为止,下节是
支持的where字句
MongoDB学习(翻译2)的更多相关文章
- MongoDB学习3
MongoDB学习(翻译3) 支持的where字句(比较多,今天先写一部分) 本节介绍支持的where字句 正如前面提到的,不是所有的C#表达式都支持where子句.您可以以此文为指导,或者你可以 ...
- MongoDB学习2
MongoDB学习(翻译2) C#驱动之LINQ教程 介绍 本教程涵盖了1.8发布版本对linq查询的支持. 开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍 快速开始 首先,添加下面命 ...
- MongoDB学习笔记二- Mongoose
MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- MongoDB学习笔记—Linux下搭建MongoDB环境
1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MongoDB学习记录
一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- MongoDB学习:(二)MongoDB简单使用
MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...
- MongoDB学习:(一)MongoDB安装
MongoDB学习:(一)MongoDB安装 MongoDB介绍: 直接百科了: MongoDB安装: 1:下载安装: MongoDB安装:https://www.mongodb.com/do ...
随机推荐
- 小程序大智慧,sqlserver 注释提取工具
原文:小程序大智慧,sqlserver 注释提取工具 开篇背景 我习惯在写表的创建脚本时将注释直接写在脚本里,比如 /*账套*/ CREATE TABLE [dbo].[AccountingBook] ...
- crm操作安全角色
using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; using System.Co ...
- [LeetCode]N-Queens 八皇后问题扩展(经典深层搜索)
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- iOS # Charles拦截封包
Charles: 是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问代理服务器,使得 ...
- OWIN– 解耦,协作和开放
OWIN的理解和实践(一) – 解耦,协作和开放 概述 OWIN的全称是Open Web Interface For .Net, 是MS在VS2013期间引入的全新的概念, 网上已经有不少的关于它的信 ...
- Windows 10技术布局,谈微软王者归来
Windows 10技术布局,谈微软王者归来 每个时代都有王者,王者的成功,往往是因为恰逢其时地发布了一个成功的产品(具有里程碑意义,划时代的产品).Windows 95的成功标示着微软是PC时代的王 ...
- Vim实用小技巧
Vim实用小技巧 一些网络上质量较高的Vim资料 从我07年接触Vim以来,已经过去了8个年头,期间看过很多的Vim文章,我自己觉得非常不错,而且创作时间也比较近的文章有如下这些. Vim入门 目前为 ...
- APP 半自适应 WEB页面
特别赶,响应式纯自适应的,有空写了新的发. (在手机上看,页面上看一定乱) <!DOCTYPE html><html> <head> <meta http-e ...
- asp.net读取CSV
原文:asp.net读取CSV 用Excel导了两天数据,各种问题,折磨客户也折磨了自己,以前没发现的问题一下子都暴露出来了 特意收集两篇Excel跟CSV读取相关的两篇文章 asp.net读取exc ...
- POJ 1947 树DP获得冠军
特定N点,N-1的关系.建立了一棵树,问至少减去几个边缘节点可以被作为得到P树.树典型DP称号 dp[cur][j] :记录cur节点,为了得到一个j除去该子树的节点的边的最小数目 对当前树的每个子树 ...