首页 > 解决方案 > Apache Ignite .Net 生成 QueryEntity

问题描述

private QueryEntity GenarateQueryEntity(Type type)
    {
        var attrs = Attribute.GetCustomAttributes(type);
        var isNeedToCache = false;
        foreach (var attr in attrs)
        {
            if (attr is CacheableAttribute)
            {
                isNeedToCache = true;
                break;
            }
        }
    if (isNeedToCache)
    {
        var queryEntity = new QueryEntity()
        {
            ValueType = type
        };

        var fields = new List<QueryField>();
        var indexes = new List<QueryIndex>();
        var props = type.GetProperties();

        foreach (var prop in props)
        {
            var propFieldAttrs = prop.GetCustomAttributes(typeof(QuerySqlFieldAttribute), true);
            if (propFieldAttrs.Length > 0)
            {
                var item = propFieldAttrs.FirstOrDefault();
                var sqlAttr = item as QuerySqlFieldAttribute;
                if (sqlAttr.IsIndexed)
                {
                    indexes.Add(new QueryIndex(sqlAttr.IsDescending, QueryIndexType.Sorted, prop.Name)
                    {
                        InlineSize = sqlAttr.IndexInlineSize
                    });
                }
                else
                {
                    if (CacheLibSettings.IndexColumn.IndexOf(prop.Name) > -1)
                    {
                        indexes.Add(new QueryIndex(sqlAttr.IsDescending, QueryIndexType.Sorted, prop.Name)
                        {
                            InlineSize = sqlAttr.IndexInlineSize
                        });
                    }
                }

                fields.Add(new QueryField()
                {
                    Name = prop.Name,
                    FieldType = prop.PropertyType,
                    IsKeyField = true,
                    NotNull = sqlAttr.NotNull,
                    DefaultValue = sqlAttr.DefaultValue,
                    Precision = sqlAttr.Precision,
                    Scale = sqlAttr.Scale
                });
            }

            if (CacheLibSettings.IndexColumn.IndexOf(prop.Name) > -1 && propFieldAttrs.Length == 0)
            {
                var sqlAttr = new QuerySqlFieldAttribute();

                indexes.Add(new QueryIndex(sqlAttr.IsDescending, QueryIndexType.Sorted, prop.Name)
                {
                    InlineSize = sqlAttr.IndexInlineSize
                });

                fields.Add(new QueryField()
                {
                    Name = prop.Name,
                    FieldType = prop.PropertyType,
                    IsKeyField = true,
                    NotNull = sqlAttr.NotNull,
                    DefaultValue = sqlAttr.DefaultValue,
                    Precision = sqlAttr.Precision,
                    Scale = sqlAttr.Scale
                });
            }
        }

        foreach (var prop in props)
        {
            var propTextAttrs = prop.GetCustomAttributes(typeof(QueryTextFieldAttribute), true);
            if (propTextAttrs.Length > 0)
            {
                fields.Add(new QueryField() { Name = prop.Name, FieldType = prop.PropertyType, IsKeyField = true });
                indexes.Add(new QueryIndex(false, QueryIndexType.FullText, prop.Name));
            }
        }
        if (fields.Any())
        {
            queryEntity.Fields = fields.OrderBy(x => x.Name).ToList();
        }
        if (indexes.Any())
        {
            queryEntity.Indexes = indexes;
        }
        return queryEntity;
    }
    return null;
}

这个生成 QueryEntity 代码。

图 1 图 2

一个是从 Ignite New QueryEntity(Typeof (T)) 生成的,一个是从 GenarateQueryEntity(Typeof (T)) 生成的。我查看了 Ignite 源代码,其中 QueryIndexEx 是一个私有类

我的问题是:如何生成与 Ignite New QueryEntity(Typeof (T)) 相同的结果。

标签: ignite

解决方案


QueryIndexEx 仅在它具有 IndexGroups 方面有所不同,在您的情况下为空。

请分享您遇到的具体错误:我很确定这不是由 QueryIndex/QueryIndexEx 差异引起的。


推荐阅读