博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xBIM 使用Linq 来优化查询
阅读量:6242 次
发布时间:2019-06-22

本文共 2100 字,大约阅读时间需要 7 分钟。

    目录

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

// Ling 表达式 var ids =    from wall in model.Instances.OfType
() where wall.HasOpenings.Any() select wall.GlobalId;
// 使用 Lambda表达式 var ids =    model.Instances    .Where
(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[0]            .Concat(model.Instances.OfType
()) .Concat(model.Instances.OfType
()) .Concat(model.Instances.OfType
()); //遍历你所需要的实体,数量大概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();    }}

转载地址:http://wzpia.baihongyu.com/

你可能感兴趣的文章
pwnable.kr 之 passcode write up
查看>>
多任务之协程浅谈
查看>>
Qt Creator快捷键
查看>>
idea中lombok的使用
查看>>
网站集成支付宝在线支付
查看>>
mac下安装appium
查看>>
js ---- 函数防抖
查看>>
js call 和 apply
查看>>
CentOS 6.5下Percona Xtrabackup的安装错误解决方案
查看>>
VCS双机+oracle 11gR2+ASM主机名修改
查看>>
转:// LINUX下为ORACLE数据库设置大页--hugepage
查看>>
Linux文件权限与属性详解 之 chattr & lsattr
查看>>
负载均衡集群之LVS配置命令
查看>>
PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
查看>>
多线程编程
查看>>
再谈谈数学
查看>>
Scheme来实现八皇后问题(1)
查看>>
pip或者anacnda安装opencv以及opencv-contrib
查看>>
Unity 5 中的全局光照技术详解(建议收藏)
查看>>
python 的矩阵运算——numpy
查看>>