MongoDB学习(翻译2)

C#驱动之LINQ教程

介绍

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

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

快速开始

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

using MongoDB.Driver.Linq;

 

而后,声明一变量保存对集合的引用测试

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

 

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

实例:翻译

var query =

    from e in collection.AsQueryable<Employee>()

    where e.FirstName == "John"

    select e;

 

foreach (var employee in query)

{

    // do something

}

 

固然,你也能够经过lambda语法写查询表达式,先前的查询语句等同于下面的写法:code

var query =

    collection.AsQueryable<Employee>()

    .Where(e => e.FirstName == "John");

 

C#编译器会在内部把全部查询翻译为lambda句法,因此这两种写法没有优略之分,当你须要的时候(好比某些查询操做符不被支持的时候),你甚至能够混用这两种方式。htm

本教程实例中全部代码均会展现linq查询表达式和lamdba表达式(在查询操做符被支持的前提下).对象

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

支持的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 == 1);

// or

var result =

    collection.AsQueryable<C>()

    .Any(c => c.X == 1);

 

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

var result =

    collection.AsQueryable<C>()

    .Select(c => c.X)

    .Any(x => x == 1);

 

一般来讲,你能够使用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 == 1);

// or

var result =

    collection.AsQueryable<C>()

    .Count(c => c.X == 1);

 

说明:谓词一样能够经过where字句和不带谓词的Count替代,因此上面实例也能够这样写:

var result =

    (from c in collection.AsQueryable<C>()

    where c.X == 1

    select c)

    .Count();

// or

var result =

    collection.AsQueryable<C>()

    .Where(c => c.X == 1)

    .Count();

 

含有谓词的Count一样不支持投影后操做,因此下面写法是无效的。

var result =

    collection.AsQueryable<C>()

    .Select(c => c.X)

    .Count(x => x == 1);

 

解决方案和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 > 0

    orderby c.X

    select c)

    .ElementAt(index);

// or

var result =

    collection.AsQueryable<C>()

    .Where(c => c.X > 0)

    .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 > 0

    orderby c.X

    select c)

    .First();

// or

var result =

    collection.AsQueryable<C>()

    .Where(c => c.X > 0)

    .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 > 0);

// or

var result =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .First(c => c.X > 0);

 

First (含有谓词)一样不支持投影后操做,因此下面代码是无效的:

var result =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .Select(c => c.X)

    .First(x => x > 0);

 

解决方案一样和Any同样

若是集合为空,一样会抛出异常

  • FirstOrDefault

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

  • FirstOrDefault (含谓词)

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

  • Last

Last 从结果集中返回最后一个文档对象,和First相对,一般和排序操做一块儿使用:

var result =

    (from c in collection.AsQueryable<C>()

    where c.X > 0

    orderby c.X

    select c)

    .Last();

// or

var result =

    collection.AsQueryable<C>()

    .Where(c => c.X > 0)

    .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 > 0);

// or

var result =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .Last(c => c.X > 0);

 

Last 一样不支持投影后操做,因此下面写法是无效的:

var result =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .Select(c => c.X)

    .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 返回集合中文档对象属性或者字段值中的最大值,你能够筛选出投影操做识别出的字段或者属性的最大值

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 必须为最后一个操做(除了如 DistinctMax 和 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 > 0

    orderby c.X

    select c)

    .Single();

// or

var result =

    collection.AsQueryable<C>()

    .Where(c => c.X > 0)

    .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 > 0);

// or

var result =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .Single(c => c.X > 0);

 

Single 一样不支持投影后操做,因此下面代码是无效的:

var result =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .Select(c => c.X)

    .Single(x => x > 0);

 

解决方案和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(100);

// or

var query =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .Skip(100);

 

  • Take

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

var query =

    (from c in collection.AsQueryable<C>()

    orderby c.X

    select c)

    .Skip(100)

    .Take(100);

// or

var query =

    collection.AsQueryable<C>()

    .OrderBy(c => c.X)

    .Skip(100)

    .Take(100);

 

  • 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 > 0

    select c;

// or

var query =

    collection.AsQueryable<C>()

    .Where(c => c.X > 0);

 

有时也能够使用多个where字句,其左右至关于&&操做符

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

var query =

    (from c in collection.AsQueryable<C>()

    where c.X > 0

    where c.Y > 0)

    .First(c.Z > 0);

// or

var query =

    (from c in collection.AsQueryable<C>()

    where c.X > 0 && c.Y > 0 && c.Z > 0)

    .First();

先到此为止,下节是

支持的where字句

相关文章
相关标签/搜索