xBIM 基础14 使用LINQ实现最佳性能(优化查询)
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.Instances
。IEntityCollection
实现实现了像大多数的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实现最佳性能(优化查询)的更多相关文章
- xBIM 使用Linq 来优化查询
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- [.net 面向对象编程基础] (14) 重构
[.net 面向对象编程基础] (14) 重构 通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然 ...
- 十四. Python基础(14)--递归
十四. Python基础(14)--递归 1 ● 递归(recursion) 概念: recursive functions-functions that call themselves either ...
- xBIM 基础10 WeXplorer 浏览器检查
系列目录 [已更新最新开发文章,点击查看详细] 在上一篇 <xBIM基础 09 WeXplorer 基本应用> 已经提到,查看器不会在所有浏览器的所有设备上运行.为了操作效率和简单 ...
- 深入理解Java虚拟机(第三版)-14. 线程安全与锁优化
14. 线程安全与锁优化 1. 什么是线程安全? 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替进行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个 ...
- MySQL基础之第18章 性能优化
18.1.优化简介 SHOW STATUS LIKE ‘value’;connections 连接数uptime 启动 ...
- LINQ驱动数据的查询功能
一.LINQ概念 LINQ是微软在.NetFramework3.5中新加入的语言功能,在语言中以程序代码方式处理集合的能力. 1.1 LINQ VS 循环处理 在我刚工作时候,对于集合对象的处理一般是 ...
- LINQ中的一些查询语句格式
LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...
- Oracle大数据常见优化查询
[转]http://www.cnblogs.com/myhappylife/p/5006774.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的 ...
随机推荐
- 机器学习 数据量不足问题----1 做好特征工程 2 不要用太多的特征 3 做好交叉验证 使用线性svm
来自:https://www.zhihu.com/question/35649122 其实这里所说的数据量不足,可以换一种方式去理解:在维度高的情况下,数据相对少.举一个特例,比如只有一维,和1万个数 ...
- javascript中的闭包以及闭包应用
闭包简单理解就是能够读取其他函数内部变量的函数,而在javascript中只有内部函数可以读取函数的内部变量,所以我们学习javascript时可以这样理解,函数A中嵌套了一个函数B,然后我们用函数B ...
- 2.linux系统命令详解
1 shell shell:命令解释器,根据输入的命令执行相应命令. 1.1 shell家族 察看当前系统下有哪些shell: cat /etc/shells 察看当前系统正在使用的shell ech ...
- TCP和UDP的具体区别
TCP和UDP的最完整的区别 TCP UDP TCP与UDP基本区别: 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少: 3.UDP程序结构较简单 4.流模式(TCP)与数据报模式(UD ...
- Elasticsearch部署异常Permission denied
异常描述 在Linux上部署ElasticSearch时抛出了一个异常如下: log4j:ERROR setFile(null,true) call failed. java.io.FileNotFo ...
- CSS大纲
- Python——微信数据分析
数据可视化:http://echarts.baidu.com/echarts2/doc/example.html import refrom wxpy import *import jiebaimpo ...
- [置顶]
Linux 常用命令集锦
出处:http://www.vaikan.com/what-are-the-most-useful-swiss-army-knife-one-liners-on-unix/ Linux命令行里的&qu ...
- POJ 2187 Beauty Contest( 凸包求最远点对 )
链接:传送门 题意:给出 n 个点,求出这 n 个点中最远的两个点距离的平方 思路:最远点对一定会在凸包的顶点上,然后直接暴力找一下凸包顶点中距离最远的两个点 /******************* ...
- html全屏显示
JavaScript代码: function toggleFullScreen() { if (!document.fullscreenElement && // alternativ ...