ignite - 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 代码。
但
一个是从 Ignite New QueryEntity(Typeof (T)) 生成的,一个是从 GenarateQueryEntity(Typeof (T)) 生成的。我查看了 Ignite 源代码,其中 QueryIndexEx 是一个私有类。
我的问题是:如何生成与 Ignite New QueryEntity(Typeof (T)) 相同的结果。
解决方案
QueryIndexEx 仅在它具有 IndexGroups 方面有所不同,在您的情况下为空。
请分享您遇到的具体错误:我很确定这不是由 QueryIndex/QueryIndexEx 差异引起的。
推荐阅读
- angular - Angular 7:自定义异步验证器
- c++ - 如何正确地将 void * 值转换为 CString
- python - Python如何将这种类型的列表转换为字典
- php - 从给定的日期时间创建相同的时间差异
- scala - 在 Spark 中计算 Hive 表的统计信息
- kotlin - 如何用 kotlin 调用不同版本的类似扩展方法
- php - VsCode PHP-Intellisense 使用 composer 和 autoload.php
- spring-data-jpa - 如何将规范传递给 spring 数据的存储库接口上的自定义查询?
- sql - DB2/400 SQL:“分配”指令
- c# - 如何在不旋转的情况下改变 Unity 中 VerticalLayoutGroup 的扩展方向?