/// <summary> /// 为实体元数据主关键字的关联关系赋值 /// </summary> /// <param name="queue"></param> /// <param name="reader"></param> /// <param name="prefix"></param> public static void SetEntityInfoKeyRelationSelectFields(EntityInfoKeyRelation metadata, DbDataReader reader, string prefix) { metadata.ID = (Guid)reader[string.Format("{0}id", prefix)]; if (reader[string.Format("{0}entityinfoid", prefix)] != DBNull.Value) { metadata.EntityInfoId = (Guid)reader[string.Format("{0}entityinfoid", prefix)]; } if (reader[string.Format("{0}entityattributeinfoid", prefix)] != DBNull.Value) { metadata.EntityAttributeInfoId = (Guid)reader[string.Format("{0}entityattributeinfoid", prefix)]; } if (reader[string.Format("{0}order", prefix)] != DBNull.Value) { metadata.Order = (int)reader[string.Format("{0}order", prefix)]; } if (reader[string.Format("{0}createtime", prefix)] != DBNull.Value) { metadata.CreateTime = (DateTime)reader[string.Format("{0}createtime", prefix)]; } if (reader[string.Format("{0}modifytime", prefix)] != DBNull.Value) { metadata.ModifyTime = (DateTime)reader[string.Format("{0}modifytime", prefix)]; } }
/// <summary> /// 根据实体元数据ID查询该实体元数据关联的全部记录 /// </summary> /// <param name="infoId"></param> /// <param name="callback"></param> /// <returns></returns> public async Task QueryAllByEntityInfoId(Guid infoId, Func <EntityInfoKeyRelation, Task> callback) { List <EntityInfoKeyRelation> itemList = new List <EntityInfoKeyRelation>(); await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, true, false, _entityMetadataConnectionFactory.CreateReadForEntityMetadata(), async (conn, transaction) => { int?sequence = null; int pageSize = 500; while (true) { itemList.Clear(); SqlTransaction sqlTran = null; if (transaction != null) { sqlTran = (SqlTransaction)transaction; } await using (SqlCommand commond = new SqlCommand() { Connection = (SqlConnection)conn, CommandType = CommandType.Text, Transaction = sqlTran }) { if (!sequence.HasValue) { commond.CommandText = string.Format(@"SELECT TOP (@pagesize) {0},{1},{2} FROM [EntityInfoKeyRelation] AS keyrelation INNER JOIN [EntityInfo] AS info ON keyrelation.[entityinfoid] = info.[id] INNER JOIN [EntityAttributeInfo] AS attribute ON keyrelation.[entityattributeinfoid] = attribute.[id] WHERE info.[id] = @id ORDER BY keyrelation.[order];", StoreHelper.GetEntityInfoKeyRelationSelectFields("keyrelation"), StoreHelper.GetEntityInfoSelectFields("info"), StoreHelper.GetEntityAttributeInfoSelectFields("attribute")); } else { commond.CommandText = string.Format(@"SELECT TOP (@pagesize) {0},{1},{2} FROM [EntityInfoKeyRelation] AS keyrelation INNER JOIN [EntityInfo] AS info ON keyrelation.[entityinfoid] = info.[id] INNER JOIN [EntityAttributeInfo] AS attribute ON keyrelation.[entityattributeinfoid] = attribute.[id] WHERE info.[id] = @id AND keyrelation.[order] > @sequence ORDER BY keyrelation.[order];", StoreHelper.GetEntityInfoKeyRelationSelectFields("keyrelation"), StoreHelper.GetEntityInfoSelectFields("info"), StoreHelper.GetEntityAttributeInfoSelectFields("attribute")); } var parameter = new SqlParameter("@id", SqlDbType.UniqueIdentifier) { Value = infoId }; commond.Parameters.Add(parameter); parameter = new SqlParameter("@pagesize", SqlDbType.Int) { Value = pageSize }; commond.Parameters.Add(parameter); if (sequence.HasValue) { parameter = new SqlParameter("@sequence", SqlDbType.BigInt) { Value = sequence }; commond.Parameters.Add(parameter); } await commond.PrepareAsync(); SqlDataReader reader = null; await using (reader = await commond.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { var item = new EntityInfoKeyRelation(); StoreHelper.SetEntityInfoKeyRelationSelectFields(item, reader, "keyrelation"); sequence = (int)reader["keyrelationorder"]; item.EntityInfo = new EntityInfo(); StoreHelper.SetEntityInfoSelectFields(item.EntityInfo, reader, "info"); item.EntityAttributeInfo = new EntityAttributeInfo(); StoreHelper.SetEntityAttributeInfoSelectFields(item.EntityAttributeInfo, reader, "attribute"); itemList.Add(item); } await reader.CloseAsync(); } } foreach (var item in itemList) { await callback(item); } if (itemList.Count != pageSize) { break; } } }); }