优先从内存查询设备变量,提升查询速度
This commit is contained in:
parent
b88b2a5083
commit
e0edf777dc
@ -47,7 +47,7 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVMs
|
|||||||
DriverId = device.DriverId,
|
DriverId = device.DriverId,
|
||||||
Description = device.Description,
|
Description = device.Description,
|
||||||
DeviceTypeEnum = device.DeviceTypeEnum,
|
DeviceTypeEnum = device.DeviceTypeEnum,
|
||||||
Parent= device.Parent
|
Parent = device.Parent
|
||||||
};
|
};
|
||||||
DC.Set<Device>().Add(newDevice);
|
DC.Set<Device>().Add(newDevice);
|
||||||
devices.Add(newDevice);
|
devices.Add(newDevice);
|
||||||
@ -67,7 +67,7 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVMs
|
|||||||
DC.Set<DeviceConfig>().Add(newDeviceConfig);
|
DC.Set<DeviceConfig>().Add(newDeviceConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var deviceVariable in deviceVariables.OrderBy(x=>x.Index))
|
foreach (var deviceVariable in deviceVariables.OrderBy(x => x.Index))
|
||||||
{
|
{
|
||||||
var newDeviceVariable = new DeviceVariable
|
var newDeviceVariable = new DeviceVariable
|
||||||
{
|
{
|
||||||
@ -75,6 +75,7 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVMs
|
|||||||
Name = deviceVariable.Name,
|
Name = deviceVariable.Name,
|
||||||
Description = deviceVariable.Description,
|
Description = deviceVariable.Description,
|
||||||
DataType = deviceVariable.DataType,
|
DataType = deviceVariable.DataType,
|
||||||
|
IsTrigger = deviceVariable.IsTrigger,
|
||||||
Method = deviceVariable.Method,
|
Method = deviceVariable.Method,
|
||||||
ProtectType = deviceVariable.ProtectType,
|
ProtectType = deviceVariable.ProtectType,
|
||||||
Expressions = deviceVariable.Expressions,
|
Expressions = deviceVariable.Expressions,
|
||||||
|
@ -10,6 +10,7 @@ using IoTGateway.Model;
|
|||||||
using PluginInterface;
|
using PluginInterface;
|
||||||
using Plugin;
|
using Plugin;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace IoTGateway.ViewModel.BasicData.DeviceVariableVMs
|
namespace IoTGateway.ViewModel.BasicData.DeviceVariableVMs
|
||||||
{
|
{
|
||||||
@ -104,31 +105,25 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVariableVMs
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void AfterDoSearcher()
|
|
||||||
{
|
|
||||||
var deviceService = Wtm.ServiceProvider.GetService(typeof(DeviceService)) as DeviceService;
|
|
||||||
Parallel.ForEach(EntityList, item =>
|
|
||||||
{
|
|
||||||
var dapThread = deviceService!.DeviceThreads.FirstOrDefault(x => x.Device.ID == item.DeviceId);
|
|
||||||
var variable = dapThread?.DeviceValues?.Where(x => x.Key == item.ID).Select(x=>x.Value).FirstOrDefault();
|
|
||||||
|
|
||||||
if (variable is { Value: not null })
|
|
||||||
{
|
|
||||||
item.Value = variable.Value;
|
|
||||||
item.CookedValue = variable.CookedValue;
|
|
||||||
item.StatusType = variable.StatusType;
|
|
||||||
item.Timestamp = variable.Timestamp;
|
|
||||||
item.Message = variable.Message;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
public override IOrderedQueryable<DeviceVariable_View> GetSearchQuery()
|
public override IOrderedQueryable<DeviceVariable_View> GetSearchQuery()
|
||||||
{
|
{
|
||||||
if (Searcher.DeviceId != null)
|
if (Searcher.DeviceId != null)
|
||||||
IoTBackgroundService.VariableSelectDeviceId = Searcher.DeviceId;
|
IoTBackgroundService.VariableSelectDeviceId = Searcher.DeviceId;
|
||||||
|
|
||||||
var query = DC.Set<DeviceVariable>().Include(x => x.Device)
|
|
||||||
|
var deviceService = Wtm.ServiceProvider.GetService(typeof(DeviceService)) as DeviceService;
|
||||||
|
//设备线程中的所有设备
|
||||||
|
var threadDeviceIds = deviceService?.DeviceThreads.Select(x => x.Device.ID).Distinct(x => x);
|
||||||
|
//设备线程中的变量
|
||||||
|
var threadVariables =
|
||||||
|
deviceService?.DeviceThreads.SelectMany(deviceThread => deviceThread.Device.DeviceVariables);
|
||||||
|
//查找数据库中额外的变量
|
||||||
|
var dcVariables = DC.Set<DeviceVariable>().AsNoTracking().Include(x => x.Device)
|
||||||
|
.Where(x => !threadDeviceIds.Contains((Guid)x.DeviceId)).AsEnumerable();
|
||||||
|
|
||||||
|
var variables = dcVariables.Union(threadVariables).AsQueryable();
|
||||||
|
|
||||||
|
var query = variables
|
||||||
.CheckContain(Searcher.Name, x => x.Name)
|
.CheckContain(Searcher.Name, x => x.Name)
|
||||||
.CheckContain(Searcher.Alias, x => x.Alias)
|
.CheckContain(Searcher.Alias, x => x.Alias)
|
||||||
.CheckContain(Searcher.Method, x => x.Method)
|
.CheckContain(Searcher.Method, x => x.Method)
|
||||||
@ -148,13 +143,19 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVariableVMs
|
|||||||
IsTrigger = x.IsTrigger,
|
IsTrigger = x.IsTrigger,
|
||||||
EndianType = x.EndianType,
|
EndianType = x.EndianType,
|
||||||
Expressions = x.Expressions,
|
Expressions = x.Expressions,
|
||||||
IsUpload=x.IsUpload,
|
IsUpload = x.IsUpload,
|
||||||
ProtectType = x.ProtectType,
|
ProtectType = x.ProtectType,
|
||||||
DeviceName_view = x.Device.DeviceName,
|
DeviceName_view = x.Device.DeviceName,
|
||||||
Alias = x.Alias,
|
Alias = x.Alias,
|
||||||
Device = x.Device
|
Device = x.Device,
|
||||||
|
Value = x.Value,
|
||||||
|
CookedValue = x.CookedValue,
|
||||||
|
StatusType = x.StatusType,
|
||||||
|
Timestamp = x.Timestamp,
|
||||||
|
Message = x.Message,
|
||||||
})
|
})
|
||||||
.OrderBy(x => x.Index).ThenBy(x => x.DeviceName_view).ThenBy(x => x.Alias).ThenBy(x => x.Method).ThenBy(x => x.DeviceAddress);
|
.OrderBy(x => x.Index).ThenBy(x => x.DeviceName_view).ThenBy(x => x.Alias).ThenBy(x => x.Method)
|
||||||
|
.ThenBy(x => x.DeviceAddress);
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user