博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xBIM 基础14 使用LINQ实现最佳性能(优化查询)
阅读量:4353 次
发布时间:2019-06-07

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

系列目录     

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

// LINQ 表达式var ids =    from wall in model.Instances.OfType
() where wall.HasOpenings.Any() select wall.GlobalId;
//Lambda 表达式。效果与上述的 Linq 表达式相同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();    }}
 
系列目录     

转载于:https://www.cnblogs.com/SavionZhang/p/10983383.html

你可能感兴趣的文章
Fedora14 mount出现错误时解决办法【亲测有效】
查看>>
使用Visual Studio 2013进行UI自动化测试
查看>>
13-集体照
查看>>
读了曾国藩家书,,心态逐渐平和起来。搞技术的如果缺乏信念的指引,生活会很乏味无聊!...
查看>>
160809308周子济第六次作业
查看>>
大型Web应用运行时 PHP负载均衡指南
查看>>
为phpStorm 配置PHP_CodeSniffer自动检查代码
查看>>
测试工具网址大全(转)
查看>>
ServiceStack DotNet Core前期准备
查看>>
webpack中‘vant’全局引入和按需引入【vue-cli】
查看>>
Date、String和Timestamp类型转换
查看>>
计算机的组成
查看>>
[简单到爆]eclipse-jee-neon的下载和安装
查看>>
vector
查看>>
Redis学习之set类型总结
查看>>
栈和队列
查看>>
CSS2-3常见的demo列子总结一
查看>>
第522篇--DataTable to Excel C#
查看>>
C++\virtual 虚函数、纯虚函数
查看>>
asp.net mvc 4多级area实现技巧
查看>>