大多数人接触Db4o的查询,都是从“样本查询”(Query by Example)开始的,这种查询方式简单但不方便,功能和性能也很受局限。以下是引自官方的样本查询示例:

// retrievePilotByName
Pilot proto=new Pilot("Michael Schumacher",0);
ObjectSet result=db.get(proto);
listResult(result);

这种查询要求我们先建立一个样本,然后再交由Db4o根据此样本返回符合条件的数据,其主要的不便之处在于对类默认值的处理及组合条件查询上,同时其执行性能是很差的。

而当Db4o开始支持.Net 3.5之后,我们就有了更为简单且又十分方便而强大的选择了,让我们来一起领略Db4o与.Net 3.5擦出的火花之美吧:

准备工作

首先创建一个命令行应用程序。

书写一个简单的“学生”类:

public class 学生
{
    static Random R = new Random();

public 学生(int 学号)
    {
        this.学号 = 学号;
        性别 = R.Next(2) == 1;
        成绩 = R.Next(101);
    }

public int 学号 { get; set; }
    public bool 性别 { get; set; }
    public int 成绩 { get; set; }

public override string ToString()
    {
        return string.Format("学号:{0:0000} 性别:{1} 成绩:{2}", 学号, 性别 ? "男" : "女", 成绩);
    }
}

该类就是用于模拟学生的数据,性别和成绩都是在构造时随机生成的。
然后引入Db4o对应.Net 3.5版的dll:
 
引入命名空间:

using Db4objects.Db4o;
using Db4objects.Db4o.Linq;

在Main函数中编写代码:

var db = Db4oFactory.OpenFile("db.db4o");

for (int i = 0; i < 5000; i++)
{
    db.Store(new 学生(i));
}

这段代码用于打开数据库,并存储5000个学生数据到数据库中。
 

Linq查询

接着编写Linq查询代码,将查询到的集合存入变量l中:

var l = (from 学生 q in db
            where !q.性别 && q.成绩 == 100
            orderby q.学号 descending
            select q).Take(5);

这里我们查询的是所有成绩为100的女生,并将结果按学号降序排列,取最前面的5位。

由此可看出Db4o与Linq结合的非常紧密,我们在使用Linq查询时完全没有任何不适应感,依然是得心应手的感觉。

然后遍历并输出一下结果:

foreach (var f in l)
{
    Console.WriteLine(f);
}

Console.ReadLine();

查询结果输出:

Lambda表达式查询

其实这个在支持Linq之前就已经获得支持了,或者说支持Lambda表达式这项工作根本不是Db4o开发人员的工作范畴。

我们知道Lambda表达式其实就是一个委托,而Db4o的原生查询(Native Queries)所需的参数就是一个委托,所以也就说在.Net框架引入Lambda表达式的时候,它就已经可以被用在Db4o查询中了。以下是引自官方的原生查询示例:

IList <Pilot> pilots = db.Query <Pilot> (delegate(Pilot pilot) {return pilot.Points == 100;
});

你可以很轻松的把它改为Lambda表达式形式:

IList <Pilot> pilots = db.Query <Pilot> (q=>q.Points ==100);

这样就简明许多了吧?

同理,上文的Linq查询也可以改作:

var l = db.Query<学生>(q => !q.性别 && q.成绩 == 100).OrderByDescending(q => q.学号).Take(5);

得到的结果是等同的,而书写上更为方便,推荐使用。

结语

Db4o很好很强大,现在很多一流大企业也都开始使用它了,它在开发效率和数据持久化方式上都带来了质的革新,绝对值得我们学习和使用。

推荐学习资料: 《db4o7.0指南》(译者:hankjin、jeff、lixianfeng、richard.liangyx、cleverpig)

下载

示例源代码:http://www.uushare.com/user/icesee/file/3490887

本文的XPS版本:http://www.uushare.com/user/icesee/file/3490892

本文转自斯克迪亚博客园博客,原文链接http://www.cnblogs.com/SkyD/archive/2010/09/08/1821074.html,如需转载请自行联系原作者

Db4o结合Linq、Lambda表达式的简单示例相关推荐

  1. php有lambda表达式吗,Python中lambda表达式的简单介绍(附示例)

    本篇文章给大家带来的内容是关于Python中lambda表达式的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:匿名函数的定义 lambda parameter ...

  2. Lambda 表达式基础理论与示例

    Lambda 表达式基础理论与示例 Lambda 表达式,也可称为闭包,推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lam ...

  3. Linq lambda表达式经验总结

    Linq有很多值得学习的地方,这里我们主要介绍Linq lambda表达式,包括介绍Expression tree等方面. Linq lambda表达式 了解过C# 3.0的新特性的话应该知道,在C# ...

  4. JDK8系列之Lambda表达式教程和示例

    JDK8系列之Lambda表达式教程和示例 1.Lambada 表达式简介 Lambda 表达式是一种匿名函数,但对Java中的Lambda表达式而已并不完全正确,简单来说,Lambda表达式是一种没 ...

  5. Lambda表达式常用代码示例

    Lambda表达式常用代码示例 2017-10-24 目录 1 Lambda表达式是什么 2 Lambda表达式语法 3 函数式接口是什么   3.1 常用函数式接口 4 Lambdas和Stream ...

  6. boost::proto模块实现构建算术表达式的简单示例 带有占位符的评估器的测试程序

    boost::proto模块实现构建算术表达式的简单示例带有占位符的评估器的测试程序 实现功能 C++实现代码 实现功能 boost::proto模块实现构建算术表达式的简单示例带有占位符的评估器的测 ...

  7. lambda表达式的简单应用

    lambda表达式:是Java8中的新特性 Java8中引入Lambda表达式,使得java可以函数式编程,在并发性能上迈出了实质性的一步. 函数式编程:(英语:functional programm ...

  8. java 拉姆表达式_Java8 lambda表达式10个示例

    Java 8 lambda表达式示例 转自importNew 原文链接 例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现R ...

  9. C#中其他简单LINQ查询表达式的简单使用介绍

    本文主要记录下其他简单LINQ表达式,因为比较简单,记录下以后方便回忆,本文也会持续更新. 一些有用的LINQ扩展方法: LINQ表达式 作用 是否延迟查询 Range 生成指定范围内的整数的序列   ...

最新文章

  1. Linux给用户添加sudo权限
  2. 这份美团架构师讲解的JVM知识,让我疫情期间,成功拿下阿里offer
  3. 2-1 什么是人工智能|人工智能框架TensorFlow应用实践
  4. Docker 方式安装 Nexus 私服
  5. 年龄与疾病(信息学奥赛一本通-T1106)
  6. 于无声处 启明星辰吹响工控安全号角
  7. 数据治理常见的误区有哪些
  8. Mysql 分组聚合实现 over partition by 功能
  9. MyBatis逆向工程生成代码(附源码)
  10. RHEL6.4下一键安装 Redmine
  11. admui3字体无法删除_做了一个过往字体汇总,含字体使用教程及简易搜寻字体方法...
  12. mcc、mbuild和mex命令详解
  13. drools中Fact的equality modes
  14. 区块链三种网络地址btc\eth\fil
  15. 技术分享 | 排序(filesort)详细解析(8000 字长文)
  16. 即时聊天表情功能的实现
  17. 张一鸣宣布卸任字节跳动CEO;贝壳找房创始人左晖因病去世 | 高管变动2021年5月17日-22日...
  18. 当企业服务总线遇到云服务
  19. 单碟500GB 希捷7200.12 750GB硬盘上市
  20. 备份基础知识及容量测算

热门文章

  1. 量子纠缠背后的故事(廿五):深藏幕后的神秘力量
  2. 北大发布最新《图神经网络推荐系统》2020综述论文,27页pdf
  3. 王恩哥院士:信息化发展进程中,科学、基础研究和技术、应用都是关键
  4. 神秘的中国超算:比肩高铁的世界级领先
  5. 人工智能正在向具有“高情商”发展
  6. 中国电子学会发布《新一代人工智能领域十大最具成长性技术展望(2018-2019年)》...
  7. 人工智能军备竞赛:一文尽览全球主要国家AI战略
  8. 拿下丰厚的年终奖,却未能拯救总薪酬,2021 年度 IT 薪酬调查报告出炉!
  9. 厉害!国内大学生计算机编程第一人,一人挑战一个队,百度最年轻 T10,现创业自动驾驶...
  10. Spring MVC-表单(Form)标签-单选按钮集合(RadioButtons)示例(转载实践)