using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife.Data;
using XCode;
using XCode.Shards;
namespace IoT.Data;
public partial class DeviceData : Entity<DeviceData>
{
#region 对象æ“作
static DeviceData()
{
Meta.Table.DataTable.InsertOnly = true;
// 按天分表
Meta.ShardPolicy = new TimeShardPolicy(nameof(Id), Meta.Factory)
{
TablePolicy = "{0}_{1:yyyyMMdd}",
Step = TimeSpan.FromDays(1),
};
// 过滤器 UserInterceptorã€TimeInterceptorã€IPInterceptor
Meta.Interceptors.Add<TimeInterceptor>();
Meta.Interceptors.Add<IPInterceptor>();
Meta.Interceptors.Add<TraceInterceptor>();
}
/// <summary>验è¯å¹¶ä¿®è¡¥æ•°æ®ï¼Œé€šè¿‡æŠ›å‡ºå¼‚å¸¸çš„æ–¹å¼æç¤ºéªŒè¯å¤±è´¥ã€‚</summary>
/// <param name="isNew">æ˜¯å¦æ’å…¥</param>
public override void Valid(Boolean isNew)
{
// å¦‚æžœæ²¡æœ‰è„æ•°æ®ï¼Œåˆ™ä¸éœ€è¦è¿›è¡Œä»»ä½•处ç†
if (!HasDirty) return;
// 建议先调用基类方法,基类方法会åšä¸€äº›ç»Ÿä¸€å¤„ç†
base.Valid(isNew);
// 在新æ’å…¥æ•°æ®æˆ–è€…ä¿®æ”¹äº†æŒ‡å®šå—æ®µæ—¶è¿›è¡Œä¿®æ£
//if (isNew && !Dirtys[nameof(CreateTime)]) CreateTime = DateTime.Now;
//if (isNew && !Dirtys[nameof(CreateIP)]) CreateIP = ManageProvider.UserHost;
}
///// <summary>首次连接数æ®åº“æ—¶åˆå§‹åŒ–æ•°æ®ï¼Œä»…用于实体类é‡è½½ï¼Œç”¨æˆ·ä¸åº”该调用该方法</summary>
//[EditorBrowsable(EditorBrowsableState.Never)]
//protected override void InitData()
//{
// // InitData一般用于当数æ®è¡¨æ²¡æœ‰æ•°æ®æ—¶æ·»åŠ ä¸€äº›é»˜è®¤æ•°æ®ï¼Œè¯¥å®žä½“类的任何第一次数æ®åº“æ“作都会触å‘该方法,默认异æ¥è°ƒç”¨
// if (Meta.Session.Count > 0) return;
// if (XTrace.Debug) XTrace.WriteLine("开始åˆå§‹åŒ–DeviceData[设备数æ®]æ•°æ®â€¦â€¦");
// var entity = new DeviceData();
// entity.Id = 0;
// entity.DeviceId = 0;
// entity.Name = "abc";
// entity.Kind = "abc";
// entity.Value = "abc";
// entity.Timestamp = 0;
// entity.TraceId = "abc";
// entity.Creator = "abc";
// entity.CreateTime = DateTime.Now;
// entity.CreateIP = "abc";
// entity.Insert();
// if (XTrace.Debug) XTrace.WriteLine("完æˆåˆå§‹åŒ–DeviceData[设备数æ®]æ•°æ®ï¼");
//}
///// <summary>å·²é‡è½½ã€‚基类先调用Valid(true)éªŒè¯æ•°æ®ï¼Œç„¶åŽåœ¨äº‹åŠ¡ä¿æŠ¤å†…è°ƒç”¨OnInsert</summary>
///// <returns></returns>
//public override Int32 Insert()
//{
// return base.Insert();
//}
///// <summary>å·²é‡è½½ã€‚åœ¨äº‹åŠ¡ä¿æŠ¤èŒƒå›´å†…å¤„ç†ä¸šåŠ¡ï¼Œä½äºŽValid之åŽ</summary>
///// <returns></returns>
//protected override Int32 OnDelete()
//{
// return base.OnDelete();
//}
#endregion
#region 扩展属性
/// <summary>设备</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public Device Device => Extends.Get(nameof(Device), k => Device.FindById(DeviceId));
/// <summary>设备</summary>
[Map(nameof(DeviceId), typeof(Device), "Id")]
public String DeviceName => Device?.Name;
#endregion
#region 扩展查询
/// <summary>æ ¹æ®ç¼–å·æŸ¥æ‰¾</summary>
/// <param name="id">ç¼–å·</param>
/// <returns>实体对象</returns>
public static DeviceData FindById(Int64 id)
{
if (id <= 0) return null;
// 实体缓å˜
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// å•对象缓å˜
return Meta.SingleCache[id];
//return Find(_.Id == id);
}
/// <summary>æ ¹æ®è®¾å¤‡ã€ç¼–å·æŸ¥æ‰¾</summary>
/// <param name="deviceId">设备</param>
/// <param name="id">ç¼–å·</param>
/// <returns>实体列表</returns>
public static IList<DeviceData> FindAllByDeviceIdAndId(Int32 deviceId, Int64 id)
{
// 实体缓å˜
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.DeviceId == deviceId && e.Id == id);
return FindAll(_.DeviceId == deviceId & _.Id == id);
}
/// <summary>æ ¹æ®è®¾å¤‡æŸ¥æ‰¾</summary>
/// <param name="deviceId">设备</param>
/// <returns>实体列表</returns>
public static IList<DeviceData> FindAllByDeviceId(Int32 deviceId)
{
if (deviceId <= 0) return new List<DeviceData>();
// 实体缓å˜
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.DeviceId == deviceId);
return FindAll(_.DeviceId == deviceId);
}
/// <summary>æ ¹æ®è®¾å¤‡ã€å称查找</summary>
/// <param name="deviceId">设备</param>
/// <param name="name">åç§°</param>
/// <returns>实体列表</returns>
public static IList<DeviceData> FindAllByDeviceIdAndName(Int32 deviceId, String name)
{
// 实体缓å˜
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.DeviceId == deviceId && e.Name.EqualIgnoreCase(name));
return FindAll(_.DeviceId == deviceId & _.Name == name);
}
/// <summary>æ ¹æ®è®¾å¤‡ã€ç±»åž‹æŸ¥æ‰¾</summary>
/// <param name="deviceId">设备</param>
/// <param name="kind">类型</param>
/// <returns>实体列表</returns>
public static IList<DeviceData> FindAllByDeviceIdAndKind(Int32 deviceId, String kind)
{
// 实体缓å˜
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.DeviceId == deviceId && e.Kind.EqualIgnoreCase(kind));
return FindAll(_.DeviceId == deviceId & _.Kind == kind);
}
#endregion
#region 高级查询
/// <summary>高级查询</summary>
/// <param name="deviceId">设备</param>
/// <param name="name">å称。MQTTçš„Topic,或者属性å</param>
/// <param name="start">创建时间开始</param>
/// <param name="end">创建时间结æŸ</param>
/// <param name="key">关键å—</param>
/// <param name="page">åˆ†é¡µå‚æ•°ä¿¡æ¯ã€‚坿ºå¸¦ç»Ÿè®¡å’Œæ•°æ®æƒé™æ‰©å±•查询ç‰ä¿¡æ¯</param>
/// <returns>实体列表</returns>
public static IList<DeviceData> Search(Int32 deviceId, String name, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (deviceId >= 0) exp &= _.DeviceId == deviceId;
if (!name.IsNullOrEmpty()) exp &= _.Name == name;
exp &= _.Id.Between(start, end, Meta.Factory.Snow);
if (!key.IsNullOrEmpty()) exp &= SearchWhereByKeys(key);
return FindAll(exp, page);
}
// Select Count(Id) as Id,Category From DeviceData Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20
//static readonly FieldCache<DeviceData> _CategoryCache = new FieldCache<DeviceData>(nameof(Category))
//{
//Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
//};
///// <summary>获å–ç±»åˆ«åˆ—è¡¨ï¼Œå—æ®µç¼“å˜10åˆ†é’Ÿï¼Œåˆ†ç»„ç»Ÿè®¡æ•°æ®æœ€å¤šçš„å‰20ç§ï¼Œç”¨äºŽé”æ–¹å‰å°ä¸‹æ‹‰é€‰æ‹©</summary>
///// <returns></returns>
//public static IDictionary<String, String> GetCategoryList() => _CategoryCache.FindAllName();
#endregion
#region 业务æ“作
#endregion
}
|