xBIM 基础14 使用LINQ实现最佳性能(优化查询)

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

// 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倍!请不要使用这种类型的代码:ui

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();
    }
}
 
相关文章
相关标签/搜索