public void Delete(string customerId)
{
using( Mongo mongo = new Mongo(_connectionString) ) {
mongo.Connect();
var db = mongo.GetDatabase(_dbName);
var collection = db.GetCollection<Customer>(); // 从集合中删除指定的对象
collection.Remove(x => x.CustomerID == customerId);
}
}
这里的x => x.CustomerID == customerId
x从哪里冒出来的?mongodb 数据库 对象 方法
{
using( Mongo mongo = new Mongo(_connectionString) ) {
mongo.Connect();
var db = mongo.GetDatabase(_dbName);
var collection = db.GetCollection<Customer>(); // 从集合中删除指定的对象
collection.Remove(x => x.CustomerID == customerId);
}
}
这里的x => x.CustomerID == customerId
x从哪里冒出来的?mongodb 数据库 对象 方法
解决方案 »
- 我想用C#做个COM,请大家不吝赐教。
- 跪求vs2008中*.aspx.cs不能找到.aspx中控件的问题
- C#中如何截取系统时间???
- 问一个安于安装vs2008的问题。
- C#能做什么样的网站?
- 一直用的VC++,现在开始要用C#写个程序,能否请高手给个思路,非常感谢!
- DataTable 或 DataSet 生成 XML !!!
- c#如何让一个listbox中的某一数据通过一个BUTTON按钮转移到另一个listbox中去
- 怎么修改VS2005中使用向导建立的*.xsd文件如何(C#)修改其数据库连接字符串
- +++再问Dotnet安装部署???
- List<Rectangle> 的集合怎么修改矩形的点?
- Socket 不停发送数据占CPU问题!!!在线等!
private static readonly string _connectionString = "Server=127.0.0.1";private static readonly string _dbName = "MyNorthwind";全局的就这两句话
LINQ 查询表达式
因为 静态扩展方法(委托变量)
因为 委托变量=new委托(Lambda 表达式==匿名方法)
所以这个x就是参数
x.CustomerID == customerId 那这句话是什么意思呢?
{
.....
}这样的方法,在这个方法体内,你可以调用 recordSet查找所有对象出来,并且在内存里逐一判断 cond 函数是否返回true,仅返回这些对象!而这里,凡是定义为 Func<T,bool>的函数(输入是一个对象,输出是bool结果)其实都可以用你见到的这个lamda表达式来调用!不过要说的是,这种自己写的简单方法效率太低了。而各种数据库团队写的方法,通常都是 IQueryable 而不是 IEnumerable,因为它们自己要实现表达式解析,并且动态编译(实际上就是执行)转换为数据库原生的查询方法,再查询数据库。也就是说,人家的驱动不是把数据全都读取和反序列到内存里再来过滤的,而是数据库系统本身的机制(可能在本机、可能在其它机器、可能分片到多台机器,总之是直接操作人家底层的内部数据对象)就计算好了,仅仅返回几个符合查询条件的对象,而不是返回所有对象。
是否可以理解为 .x 为 collection 对象呢?
当然,这无法编译通过,因为我们只是知道我们有这个需求,还没有写出支持它的接口了。那么你可以添加一个cs文件,内容例如using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;namespace WindowsFormsApplication2
{
public static class Class1
{ public static IEnumerable<Control> FindControls(this Form form, Func<FontFamily, bool> condi)
{
throw new NotImplementedException();
}
}
}
再次执行,不但可以编译,而且可以执行!这里我没有去实现FindControls方法内部,这不是重点。这至少说明了,你自己写一个方法,它用来根据调用者提供的 condi 查询条件来查询 form 上的控件,而这个扩展方法可以那样调用(就好像Form类对象原本就有那样的方法定义一样)。这里例子即说明了“扩展方法”的用法,也说明了lamda表达式的用法。
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;
using System.Linq;namespace WindowsFormsApplication2
{
public static class Class1
{ public static IEnumerable<Control> FindControls(this Form form, Func<FontFamily, bool> condi)
{
var 用户需要的字符 = (from f in new InstalledFontCollection().Families
where condi(f)
select f).ToList(); throw new NotImplementedException("尚未实现遍历控件的代码。");
}
}
}你就能看出Func<....>使用方法。
是否可以理解为 .x 为 collection 对象呢?
x一般可以理解为 collection 中的一个元素,有些地方可能跟他还没什么关系
x.CustomerID == customerId 那这句话是什么意思呢?我之前用过一段时间的Lambda 表达式 ,我的理解就是x是一个匿名方法(函数)的参数,这个参数的类型应该是一个实体类型(Customer类)吧。
按说它不但要兼容 IEnumerable<Customer>,而且其实不是使用它,而是至少要使用更具体的 IQueryable<Customer>。因为实现后者这个接口,才能直接调用.net的linq provider机制,从而自动把自定义的Func<.....>函数编织入表达式树中,从而借用linq provider技术来自动转换为调用底层原生数据库查询语句。
x.CustomerID == customerId 那这句话是什么意思呢?我之前用过一段时间的Lambda 表达式 ,我的理解就是x是一个匿名方法(函数)的参数,这个参数的类型应该是一个实体类型(Customer类)吧。有时候一个三角的回答比那4个三角的要靠谱很多。
List<object> list = new List<object>();
fortch(object x in list)
{
if(x.CustomerID == customerId)
{
list.Remove(x);
}
}