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[0]
            .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();
    }
}
 
·

 个人作品

   

    1、BIMFace.Community.SDK.NET

     开源地址:https://gitee.com/NAlps/BIMFace.SDK·

·

   

    2、ZCN.NET.Common

     开源地址:https://gitee.com/NAlps/zcn.net.common

 技术栈

   

 1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python

 2、jQuery、Vue.js、Bootstrap

 3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、达梦DM、人大金仓、 神通、南大通用 GBase、华为 GaussDB 、腾讯 TDSQL 、阿里 PolarDB、蚂蚁金服 OceanBase、东软 OpenBASE、浪潮云溪数据库 ZNBase

 4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表、读写分离

 5、架构:领域驱动设计 DDD、ABP

 6、环境:跨平台、Windows、Linux(CentOS、麒麟、统信UOS、深度Linux)、maxOS、IIS、Nginx、Apach

 7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler

   

 云原生、微服务、Docker、CI/CD、DevOps、K8S;

 Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件、RPC、ELK;

 .NET + Docker + jenkins + Github + Harbor + K8S;·

·

作者:张传宁   微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。

          专注于微软.NET技术(.NET Core、Web、MVC、WinForm、WPF)、通用权限管理系统、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。

          多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。

          熟悉中小企业软件开发过程:需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。

         


         

本文版权归作者·有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。·