目录

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

// Ling 表达式
var ids =
from wall in model.Instances.OfType<IIfcWall>()
where wall.HasOpenings.Any()
select wall.GlobalId;
// 使用 Lambda表达式
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 使用Linq 来优化查询的更多相关文章

  1. LINQ to Entities 查询语法

    转自: http://www.cnblogs.com/asingna/archive/2013/01/28/2879595.html 实体框架(Entity Framework )是 ADO.NET  ...

  2. linq按需查询

    将不确定变成确定~LINQ查询两种写法,性能没有影响,优化查询应该是“按需查询” 如果在linq中希望进行一对多的复合查询时,请直接在查询中使用join into,或者使用let 关键字,当然在建立实 ...

  3. Mysql分析优化查询的方式

    一:查询语句分析 1.通过create index idx_colunmsName on tableName(columns)为某个表的某些字段创建索引,注意主键和唯一键都会自动创建索引: 如为表st ...

  4. mysql使用索引优化查询效率

    索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度.在没 ...

  5. mysql数据库添加索引优化查询效率

    项目中如果表中的数据过多的话,会影响查询的效率,那么我们需要想办法优化查询,通常添加索引就是我们的选择之一: 1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `t ...

  6. 转linq中的Single()、First()、Take(1) LINQ 标准的查询操作符 排序 orderby、thenby、Take

    Single():操作一个集合,同时强要求只有一个对象匹配,并返回这一个. First():操作一个集合,可以有多个对象匹配,但是只返回第一个. Take(1):操作一个集合,可以有对个对象匹配,单只 ...

  7. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  8. MySQL索引和优化查询

    索引和优化查询 恰当的索引可以加快查询速度,可以分为四种类型:主键.唯一索引.全文索引.普通索引. 主键:唯一且没有null值. create table pk_test(f1 int not nul ...

  9. LINQ to Entities 查询注意事项

    1> 排序信息丢失 如果在排序操作之后执行了任何其他操作,则不能保证这些附加操作中会保留排序结果.这些操作包括 Select 和 Where 等.另外,采用表达式作为输入参数的 First 和 ...

随机推荐

  1. c语言基础学习09_复合类型

    =============================================================================涉及到的知识点有:一.结构体1.定义结构体st ...

  2. Spring框架学习笔记(2)——IOC&DI

    IOC:控制反转,创建对象的权利交给Spring,Spring会自动创建对象. DI:依赖注入,操作的对象靠Spring注入,如果不使用Spring,对象的属性值是要靠setter方法来添加的,使用S ...

  3. MFC中自定义消息

    在头文件stdafx.h中增加一个自定义消息宏 #define WM_USER_THREADEND WM_USER + 1 在于增加新消息的窗口或对话框类的头文件中增加一个回调函数声明 afx_msg ...

  4. API接口安全性设计

    http://www.jianshu.com/p/c6518a8f4040 接口的安全性主要围绕Token.Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来 ...

  5. 织梦CMS提示DedeTag Engine Create File False错误的解决办法总结

    今天帮客户升级站点,遇到了一个老问题,生成栏目的时候提示"DedeTag Engine Create File False",突然发觉这个问题竟然在以前做站的时候困扰过我多次,于是 ...

  6. 微信小程序版2048

    最近流行微信"跳一跳"小游戏,我也心血来潮写了一个微信小程序版2048,本篇文章主要分享实现2048的算法以及注意的点,一起来学习吧!(源码地址见文章末尾)   算法 1.生成4* ...

  7. OKMX6Q LTIB编译

    因为在16.04上编译有许多解决不了的错误,最后还是在飞凌的12.04虚拟机上编译的. 按照手册<OKMX6X-S2-LTIB编译手册-V1.1-2016-08-18>进行到第8步时,出现 ...

  8. 无法打开物理文件 操作系统错误 5:拒绝访问 SQL Sever

    今天分离附加数据库,分离出去然后再附加,没有问题.但是一把.mdf文件拷到其它文件夹下就出错,错误如下:    无法打开物理文件 "E:\db\homework.mdf".操作系统 ...

  9. pyspider解析

    https://www.cnblogs.com/microman/p/6111711.html #!/usr/bin/env python # -*- encoding: utf-8 -*- # Cr ...

  10. jquery 导出Excel表格

    仅在 table 中应用过!适用于导出简单的excel <script type="text/javascript" src="jquery.table2excel ...