MongoDB学习(翻译2)

C#驱动之LINQ教程

介绍

本教程涵盖了1.8发布版本对linq查询的支持。

开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍

快速开始

首先,添加下面命名空间到您的程序中:

  1. using MongoDB.Driver.Linq;

然后,声明一变量保存对集合的引用

  1. var collection = database.GetCollection<TDocument>("collectionname");

最基本调用linq查询的方式是构造一个集合变量,通过调用AsQueryable<TDocument>() 后,你便可以正常调用linq了。

实例:

  1. var query =
  2.  
  3. from e in collection.AsQueryable<Employee>()
  4.  
  5. where e.FirstName == "John"
  6.  
  7. select e;
  8.  
  9. foreach (var employee in query)
  10.  
  11. {
  12.  
  13. // do something
  14.  
  15. }

当然,你也可以通过lambda语法写查询表达式,先前的查询语句等同于下面的写法:

  1. var query =
  2.  
  3. collection.AsQueryable<Employee>()
  4.  
  5. .Where(e => e.FirstName == "John");

C#编译器会在内部把所有查询翻译为lambda句法,所以这两种写法没有优略之分,当你需要的时候(比如某些查询操作符不被支持的时候),你甚至可以混用这两种方式。

本教程实例中所有代码均会展示linq查询表达式和lamdba表达式(在查询操作符被支持的前提下).

只有linq查询可以转化为相应的MongoDB查询时该查询才会被支持解析,如果你写的linq查询不能被转化成相应的MongoDB查询,那么您的程序会在产生异常或者错误。

支持的LINQ查询操作符

本节介绍支持的LINQ查询操作符。

  • Any

不含谓词的Any只是测试集合中是否存在any文档对象(any直接引用过来,大家都明白)

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c)
  6.  
  7. .Any();
  8.  
  9. // 或者
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Any();
  • Any (含谓词)

含有谓词的Any用来测试集合中是否存在匹配的文档,匹配逻辑在谓词中

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c)
  6.  
  7. .Any(c => c.X == 1);
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Any(c => c.X == 1);

投影操作后,带有谓词的Any是不被支持的(至少当前版本),所以下面代码是不可用的。

  1. var result =
  2.  
  3. collection.AsQueryable<C>()
  4.  
  5. .Select(c => c.X)
  6.  
  7. .Any(x => x == 1);

通常来说,你可以使用where字句来替代投影操作,这样你可以移除投影操作。

  • Count

不带谓词的Count只是返回文档对象在集合中数量。

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c)
  6.  
  7. .Count();
  8.  
  9. // 或者
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Count();
  • Count (带谓词)

带有谓词的Count返回谓词匹配的文档数量。

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c)
  6.  
  7. .Count(c => c.X == 1);
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Count(c => c.X == 1);

说明:谓词同样可以通过where字句和不带谓词的Count替代,所以上面实例也可以这样写:

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. where c.X == 1
  6.  
  7. select c)
  8.  
  9. .Count();
  10.  
  11. // or
  12.  
  13. var result =
  14.  
  15. collection.AsQueryable<C>()
  16.  
  17. .Where(c => c.X == 1)
  18.  
  19. .Count();

含有谓词的Count同样不支持投影后操作,所以下面写法是无效的。

  1. var result =
  2.  
  3. collection.AsQueryable<C>()
  4.  
  5. .Select(c => c.X)
  6.  
  7. .Count(x => x == 1);

解决方案和Any一样。

  • Distinct

Distinct 返回集合中文档对象字段或者属性的唯一值,你可以投影后通过它过滤重复值。

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c.X)
  6.  
  7. .Distinct();
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Select(c => c.X)
  16.  
  17. .Distinct();

投影必须选择一个特定的字段或属性的文件。如果该字段或属性的值是在MongoDB中表示,作为一个数组,你也可以使用数组索引从数据中选择一项:

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c.A[i])
  6.  
  7. .Distinct();
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Select(c => c.A[i])
  16.  
  17. .Distinct();
  • ElementAt

ElementAt 从结果集中返回一个特定的文档,通常要和排序操作一起使用

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. where c.X > 0
  6.  
  7. orderby c.X
  8.  
  9. select c)
  10.  
  11. .ElementAt(index);
  12.  
  13. // or
  14.  
  15. var result =
  16.  
  17. collection.AsQueryable<C>()
  18.  
  19. .Where(c => c.X > 0)
  20.  
  21. .OrderBy(c => c.X)
  22.  
  23. .ElementAt(index);

如果结果集中文档对象数量少于ElementAt 中索引,会报出异常。

  • ElementAtOrDefault

ElementAtOrDefault 和ElementAt 类似,区别在于当集合中对象少于Index时前者返回null而不是报出异常。

  • First

First 返回集合中第一个对象,通常和排序一起使用。

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. where c.X > 0
  6.  
  7. orderby c.X
  8.  
  9. select c)
  10.  
  11. .First();
  12.  
  13. // or
  14.  
  15. var result =
  16.  
  17. collection.AsQueryable<C>()
  18.  
  19. .Where(c => c.X > 0)
  20.  
  21. .OrderBy(c => c.X)
  22.  
  23. .First();

如果集合为空,则First抛出异常

  • First (含谓词)

此重载允许你提供谓词逻辑给First,相当于使用where字句的first查询。

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X
  6.  
  7. select c)
  8.  
  9. .First(c => c.X > 0);
  10.  
  11. // or
  12.  
  13. var result =
  14.  
  15. collection.AsQueryable<C>()
  16.  
  17. .OrderBy(c => c.X)
  18.  
  19. .First(c => c.X > 0);

First (含有谓词)同样不支持投影后操作,所以下面代码是无效的:

  1. var result =
  2.  
  3. collection.AsQueryable<C>()
  4.  
  5. .OrderBy(c => c.X)
  6.  
  7. .Select(c => c.X)
  8.  
  9. .First(x => x > 0);

解决方案同样和Any一样

如果集合为空,同样会抛出异常

  • FirstOrDefault

FirstOrDefault  和First 不同之处在于,当集合为空时,不会抛出异常,而是返回null

  • FirstOrDefault (含谓词)

FirstOrDefault (含谓词)和First(含谓词)用法一样,不同之处在于,集合为空时,返回null不会抛出异常

  • Last

Last 从结果集中返回最后一个文档对象,和First相对,通常和排序操作一起使用:

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. where c.X > 0
  6.  
  7. orderby c.X
  8.  
  9. select c)
  10.  
  11. .Last();
  12.  
  13. // or
  14.  
  15. var result =
  16.  
  17. collection.AsQueryable<C>()
  18.  
  19. .Where(c => c.X > 0)
  20.  
  21. .OrderBy(c => c.X)
  22.  
  23. .Last();

如果集合为空,会抛出异常。

  • Last (含谓词)

此重载允许你传递谓词逻辑作为参数给Last和不带谓词的Last操作加上where字句相当。

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X
  6.  
  7. select c)
  8.  
  9. .Last(c => c.X > 0);
  10.  
  11. // or
  12.  
  13. var result =
  14.  
  15. collection.AsQueryable<C>()
  16.  
  17. .OrderBy(c => c.X)
  18.  
  19. .Last(c => c.X > 0);

Last 同样不支持投影后操作,所以下面写法是无效的:

  1. var result =
  2.  
  3. collection.AsQueryable<C>()
  4.  
  5. .OrderBy(c => c.X)
  6.  
  7. .Select(c => c.X)
  8.  
  9. .Last(x => x > 0);

解决方案和Any一样。

如果集合为空,会抛出异常

  • LastOrDefault

LastOrDefault 和 Last 不同之处在于,前者当集合为空时不会抛出异常,只是返回null

  • LastOrDefault (含谓词)

LastOrDefault(含谓词)和 Last (含谓词)用法一样,不同之处在于前者在集合为空时返回null,不会抛出异常。

  • LongCount

LongCount 用法和Count 一样,不同之处在于返回值前者是64位长整型,后者是32位。

  • LongCount (含谓词)

LongCount (含谓词)和Count (含谓词)用法一样,不同之处在于返回值前者是64位长整型,后者是32位。

  • Max

Max 返回集合中文档对象属性或者字段值中的最大值,你可以筛选出投影操作识别出的字段或者属性的最大值

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c.X)
  6.  
  7. .Max();
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Select(c => c.X)
  16.  
  17. .Max();

投影必须选择一个特定的字段或属性的文件。如果该字段或属性的值是在MongoDB中表示,作为一个数组,你也可以使用数组索引从数据中选择一项:

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c.A[i])
  6.  
  7. .Max();
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Select(c => c.A[i])
  16.  
  17. .Max();
  • Max (含选择器)

Max 重载可以让你直接传递选择参数到Max来筛选最大值,可以用来代替在投影后进行Max操作:

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c)
  6.  
  7. .Max(c => c.X);
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Max(c => c.X);
  • Min

Min 返回集合中文档对象属性或者字段值中的最小值,你可以筛选出投影操作识别出的字段或者属性的最小值

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c.X)
  6.  
  7. .Min();
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Select(c => c.X)
  16.  
  17. .Min();

投影必须选择一个特定的字段或属性的文件。如果该字段或属性的值是在MongoDB中表示,作为一个数组,你也可以使用数组索引从数据中选择一项:

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c.A[i])
  6.  
  7. .Min();
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Select(c => c.A[i])
  16.  
  17. .Min();
  • Min (含选择器)

Min 重载可以让你直接传递选择参数到Max来筛选最大值,可以用来代替在投影后进行Max操作:

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. select c)
  6.  
  7. .Min(c => c.X);
  8.  
  9. // or
  10.  
  11. var result =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Min(c => c.X);
  • OfType

OfType操作符会向查询插入一个鉴别器以便你更精确的查询文档对象

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>().OfType<D>()
  4.  
  5. select c)
  6.  
  7. // or
  8.  
  9. var result =
  10.  
  11. collection.AsQueryable<C>()
  12.  
  13. .OfType<D>();
  • OrderBy

OrderBy 用于指定结果集升序排序顺序

  1. var query =
  2.  
  3. from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X
  6.  
  7. select c;
  8.  
  9. // or
  10.  
  11. var query =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .OrderBy(c => c.X);
  • OrderByDescending

OrderByDescending  用于指定结果集降序排序顺序

  1. var query =
  2.  
  3. from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X descending
  6.  
  7. select c;
  8.  
  9. // or
  10.  
  11. var query =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .OrderByDescending(c => c.X);
  • Select

Select 用于从匹配文档中选出一个新类型的结果集。Select 必须为最后一个操作(除了如 DistinctMax 和 Min等)

注意:

Select 不会减少从服务器返回的文档对象字段或者属性,完整的文档对象还是会被返回的,然后才调用Select 方法,因此投影是在“客户端”的。

  1. var query =
  2.  
  3. from c in collection.AsQueryable<C>()
  4.  
  5. select new { c.X, c.Y };
  6.  
  7. // or
  8.  
  9. var query =
  10.  
  11. collection.AsQueryable<C>()
  12.  
  13. .Select(c => new { c.X, c.Y });
  • Single

Single 从结果集中返回第一个也是唯一的文件

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. where c.X > 0
  6.  
  7. orderby c.X
  8.  
  9. select c)
  10.  
  11. .Single();
  12.  
  13. // or
  14.  
  15. var result =
  16.  
  17. collection.AsQueryable<C>()
  18.  
  19. .Where(c => c.X > 0)
  20.  
  21. .OrderBy(c => c.X)
  22.  
  23. .Single();

如果结果集为空或者存在多个文档,Single 会抛出异常。

  • Single (含谓词)

此重载可以传递参数到Single ,等同于不含谓词的Single 加上where字句。

  1. var result =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X
  6.  
  7. select c)
  8.  
  9. .Single(c => c.X > 0);
  10.  
  11. // or
  12.  
  13. var result =
  14.  
  15. collection.AsQueryable<C>()
  16.  
  17. .OrderBy(c => c.X)
  18.  
  19. .Single(c => c.X > 0);

Single 同样不支持投影后操作,所以下面代码是无效的:

  1. var result =
  2.  
  3. collection.AsQueryable<C>()
  4.  
  5. .OrderBy(c => c.X)
  6.  
  7. .Select(c => c.X)
  8.  
  9. .Single(x => x > 0);

解决方案和Any一样。

如果结果集为空或者存在多个文档,Single 会抛出异常

  • SingleOrDefault

SingleOrDefault 和Single 用法一样,不同之处在于当集合为空或者存在多个文档对象时,会返回null,而不是抛出异常。

  • SingleOrDefault (含谓词)

SingleOrDefault(含谓词) 和Single (含谓词)用法一样,不同之处在于当集合为空或者存在多个文档对象时,会返回null,而不是抛出异常。

  • Skip

使用Skip ,指定从结果集开始跳过多少文件。通常情况下,你将结合排序操作使用。

  1. var query =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X
  6.  
  7. select c)
  8.  
  9. .Skip(100);
  10.  
  11. // or
  12.  
  13. var query =
  14.  
  15. collection.AsQueryable<C>()
  16.  
  17. .OrderBy(c => c.X)
  18.  
  19. .Skip(100);
  • Take

使用Take 指定多少文件从服务器返回。结合Skip 使用时,往往你会指定一个排序顺序。

  1. var query =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X
  6.  
  7. select c)
  8.  
  9. .Skip(100)
  10.  
  11. .Take(100);
  12.  
  13. // or
  14.  
  15. var query =
  16.  
  17. collection.AsQueryable<C>()
  18.  
  19. .OrderBy(c => c.X)
  20.  
  21. .Skip(100)
  22.  
  23. .Take(100);
  • ThenBy

ThenBy 是用来指定一个额外的升序排序的结果集。

  1. var query =
  2.  
  3. from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X, c.Y
  6.  
  7. select c;
  8.  
  9. // or
  10.  
  11. var query =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .OrderBy(c => c.X)
  16.  
  17. .ThenBy(c => c.Y);
  • ThenByDescending

ThenByDescending  是用来指定一个额外的降序排序的结果集。

  1. var query =
  2.  
  3. from c in collection.AsQueryable<C>()
  4.  
  5. orderby c.X, c.Y descending
  6.  
  7. select c;
  8.  
  9. // or
  10.  
  11. var query =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .OrderBy(c => c.X)
  16.  
  17. .ThenByDescending(c => c.Y);
  • Where

WHERE子句用于指定返回满足条件查询结果。 WHERE子句是将表达查询文档类型映射到一个布尔值句法。如果表达式返回true则结果匹配到结果集中。

  1. var query =
  2.  
  3. from c in collection.AsQueryable<C>()
  4.  
  5. where c.X > 0
  6.  
  7. select c;
  8.  
  9. // or
  10.  
  11. var query =
  12.  
  13. collection.AsQueryable<C>()
  14.  
  15. .Where(c => c.X > 0);

有时也可以使用多个where字句,其左右相当于&&操作符

例如,下面的查询是等价的:

  1. var query =
  2.  
  3. (from c in collection.AsQueryable<C>()
  4.  
  5. where c.X > 0
  6.  
  7. where c.Y > 0)
  8.  
  9. .First(c.Z > 0);
  10.  
  11. // or
  12.  
  13. var query =
  14.  
  15. (from c in collection.AsQueryable<C>()
  16.  
  17. where c.X > 0 && c.Y > 0 && c.Z > 0)
  18.  
  19. .First();

先到此为止,下节是

支持的where字句

 
 
 
标签: mongodb数据库nosql

MongoDB学习2的更多相关文章

  1. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  2. MongoDB学习笔记—Linux下搭建MongoDB环境

    1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...

  3. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  4. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  5. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

  6. MongoDB学习:(二)MongoDB简单使用

    MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...

  7. MongoDB学习:(一)MongoDB安装

    MongoDB学习:(一)MongoDB安装 MongoDB介绍:     直接百科了: MongoDB安装: 1:下载安装: MongoDB安装:https://www.mongodb.com/do ...

  8. MongoDB学习(四)客户端工具备份数据库

    在上一篇MongoDB学习(三)中讲解了如何在服务器端进行数据的导入导出与备份恢复,本篇介绍下如何利用客户端工具来进行远程服务器的数据备份到本地. 以客户端工具MongoVUE为例来进行讲解: 1.首 ...

  9. mongodb学习(1) 第一次开启 mongdb

    1.启动mongdb 可以设置为开机启动 mongod -dbpath=/data/mongodb --fork --port 27017 --logpath=/usr/local/mongodb/l ...

  10. MongoDB学习之--安全和认证

    MongoDB学习之--安全和认证 本文主要介绍两部分内容,Mongodb的安全检查配置以及安全认证操作: 虽然确保系统安全是系统管理员的重要工作,但是作为程序员了解其机制也是大有好处的,毕竟不是每个 ...

随机推荐

  1. EasyUI Combobox 默认设置

    /** *绑定运营商,默认设置, 演出CMCC, 传统的价值观念1 */ $('#operatingId').combobox({ url:'data_url', valueField:'id', t ...

  2. cocos2dx3.2 推断音效是否播放

    SimpleAudioEngine类中增加一函数 例如以下 bool isEffectPlaying(unsigned int nSoundId); 定义例如以下 bool SimpleAudioEn ...

  3. ListView排序并隔色显示

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  4. CSS3+HTML5特效1 - 上下滑动效果

    先看看效果,把鼠标移上去看看. back front 1. 本实例需要以下元素: a. 外容器 box b. 内容器 border c. 默认显示内容 front d. 滑动内容 back 2. 外容 ...

  5. Java初认识--Java语言的书写规范及基本的运算符

    一.Java中名称的规范和书写程序的规范. 1.Java中的名称规范: (1)包名全是小写:xxyyzz: (2)类名接口名:首字母大写:XxxYyy: (3)变量名和函数名:变量名不能是关键字:多单 ...

  6. The Swift Programming Language-官方教程精译Swift(4)字符串和字符

    String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 ...

  7. linux学习书籍

    linux学习书籍推荐 网上看到的,做个标记.没研究过,仅供参考  linux编程学习   inux 学习书目推荐 Linux基础 1.<Linux与Unix Shell 编程指南> C语 ...

  8. oracle存储过程+游标处理select数据

    create or replace PROCEDURE UPDATE_RECORDCODE is cursor location_data is select * from location wher ...

  9. 快速构建Windows 8风格应用15-ShareContract构建

    原文:快速构建Windows 8风格应用15-ShareContract构建 本篇博文主要介绍共享数据包.如何构建共享源.如何构建共享目标.DataTransferManager类. 共享数据包 Da ...

  10. javaproject积累——java 反射 invoke

    铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...