LINQ代表语言集成查询,它是3.5版以来的.NET Framework的一部分。它实现延迟执行,这意味着您可以链接查询语句,并且在您实际迭代结果之前它将不执行任何操作。您可以使用LINQ作为一个特定的语言,也可以使用扩展方法,从 System.Linq 延伸 IEnumerable<T> 的接口,并能得到参数作为lambda表达式。我们更喜欢后一种方法,但它是等效的。以下示例显示了两种变体都做同样的事情。两个查询的结果都是枚举具有任何开口的墙的全局唯一ID。

// LINQ 表达式
var ids =
from wall in model.Instances.OfType<IIfcWall>()
where wall.HasOpenings.Any()
select wall.GlobalId;
//Lambda 表达式。效果与上述的 Linq 表达式相同
var ids =
model.Instances
.Where<IIfcWall>(wall => wall.HasOpenings.Any())
.Select(wall => wall.GlobalId);

可以在代码中看到 Where()直接调用函数IModel.InstancesIEntityCollection实现实现了像大多数的LINQ的数据检索方法重载 Where<T>()Count<T>()FirstOrDefault<T>()OfType<T>(),它是在最低水平快速数据访问进行了优化。所有这些方法都返回IEnumerable<T>,因此您可以使用其他方法将其链接以执行进一步的选择,聚合,排序和其他操作。 IEntityCollection 函数也使用延迟执行,因此它非常适合Linq概念。如果要多次使用结果,则应强制它枚举。你可以通过调用一个做到这一点ToList<T>()ToArray<T>()ToDictionary<T>()方法。

xBIM在内部使用实体类型作为第一级过滤器,因此您应始终询问最具体的类型。请记住,它IModel.Instances包含模型中的所有实体,通常是数十万个对象!所以你不想迭代所有这些来做任何事情。请参阅以下好的和坏的示例,它们执行相同但不完全相同的操作:

public static void SelectionWithLinq()
{
const string ifcFilename = "SampleHouse.ifc";
var model = IfcStore.Open(ifcFilename);
using (var txn = model.BeginTransaction())
{
var requiredProducts = new IIfcProduct[]
.Concat(model.Instances.OfType<IIfcWallStandardCase>())
.Concat(model.Instances.OfType<IIfcDoor>())
.Concat(model.Instances.OfType<IIfcWindow>()); // 遍历你所需要的实体,大概有9个
foreach (var product in requiredProducts)
{
// 相关业务逻辑
} txn.Commit();
}
}

下面的代码示例大约4.5倍!请不要使用这种类型的代码:

public static void SelectionWithoutLinqIsSLOW()
{
const string ifcFilename = "SampleHouse.ifc";
var model = IfcStore.Open(ifcFilename);
using (var txn = model.BeginTransaction())
{
//这种方式需要迭代大约 47309 个实体,而不是仅需要9个实体。
foreach (var entity in model.Instances)
{
if (entity is IIfcWallStandardCase ||
entity is IIfcDoor ||
entity is IIfcWindow)
{
// 最好不要在这里做其他的业务逻辑
}
}
txn.Commit();
}
}
 

xBIM 基础14 使用LINQ实现最佳性能(优化查询)的更多相关文章

  1. xBIM 使用Linq 来优化查询

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  2. [.net 面向对象编程基础] (14) 重构

    [.net 面向对象编程基础] (14) 重构 通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然 ...

  3. 十四. Python基础(14)--递归

    十四. Python基础(14)--递归 1 ● 递归(recursion) 概念: recursive functions-functions that call themselves either ...

  4. xBIM 基础10 WeXplorer 浏览器检查

    系列目录    [已更新最新开发文章,点击查看详细]  在上一篇 <xBIM基础 09 WeXplorer 基本应用> 已经提到,查看器不会在所有浏览器的所有设备上运行.为了操作效率和简单 ...

  5. 深入理解Java虚拟机(第三版)-14. 线程安全与锁优化

    14. 线程安全与锁优化 1. 什么是线程安全? 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替进行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个 ...

  6. MySQL基础之第18章 性能优化

    18.1.优化简介 SHOW STATUS LIKE ‘value’;connections                 连接数uptime                          启动 ...

  7. LINQ驱动数据的查询功能

    一.LINQ概念 LINQ是微软在.NetFramework3.5中新加入的语言功能,在语言中以程序代码方式处理集合的能力. 1.1 LINQ VS 循环处理 在我刚工作时候,对于集合对象的处理一般是 ...

  8. LINQ中的一些查询语句格式

    LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...

  9. Oracle大数据常见优化查询

    [转]http://www.cnblogs.com/myhappylife/p/5006774.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的 ...

随机推荐

  1. linux的chmod,chown命令 详解

    指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案 ...

  2. 维基百科 MediaWiki API 解析

    使用开放的 API 做一个自己的小项目,是一个很好的学习方法.但好像开放的 API 选择并不多.这里给大家多一个选择,简单介绍一下维基百科使用的 MediaWiki API. 简介 先简单介绍几个容易 ...

  3. 在应用层通过spring特性解决数据库读写分离

    如何配置mysql数据库的主从? 单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案 1.应用层 http://neore ...

  4. oracle插入或更新某一个指定列来执行触发器

    表结构: create table TZ_GXSX ( ID VARCHAR2(15), PROJECT VARCHAR2(50), TXYX NUMBER(22) default '0', CDAT ...

  5. ZBrush如何把不同材质赋予同一个模型上

    ZBrush 作为最专业的数字雕刻与绘画软件,能够制作出高质量的3D模型,包括模型的颜色贴图和材质属性.不同材质可以改变照明在表面上的反应,以便模型表现出光泽.凹凸.反射.金属性或透明效果.ZBrus ...

  6. 前端dom操作竟然使得http请求的时间延长了

    最近在项目中遇到了一个奇怪的问题:在google浏览器的调试窗口network下看到一个请求的时间一直是2s多,但是当我把这个请求单独拿出来执行的时候发现根本用不了2s,100多毫秒就完成了.最后再不 ...

  7. HDU 2604 Queuing( 递推关系 + 矩阵快速幂 )

    链接:传送门 题意:一个队列是由字母 f 和 m 组成的,队列长度为 L,那么这个队列的排列数为 2^L 现在定义一个E-queue,即队列排列中是不含有 fmf or fff ,然后问长度为L的E- ...

  8. [luogu4195 Spoj3105] Mod (大步小步)

    传送门 题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入输出格式 输入格式: 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a ...

  9. linux中一次创建多个目录

    linux中创建目录当然使用命令工具mkdir == (make directory),联想记忆法能让你记得牢固. 如果你要创建几个目录,例如:dir1目录,dir2目录,dir3目录可以这样 mkd ...

  10. ElasticSearch启动报错,bootstrap checks failed

    修改elasticsearch.yml配置文件,允许外网访问. vim config/elasticsearch.yml# 增加 network.host: 0.0.0.0 启动失败,检查没有通过,报 ...