Convert query ToListAsync in separate method, not ActionResult - entity-framework-6

I am trying to 'convert' a query to List while using async to retrieve the values to a list and return the NewsListViewModel to my controller as a success or failure like so:
var model = await db.News.Where(n => n.newsPublished == false
&& n.newsTitle.Contains(query)
|| n.newsDescription.Contains(query)).
OrderBy(n => n.newsCreatedDate).Select(n => new List<NewsListViewModel>
{
NewsCreatorFName = n.Profile.profileFirstName,
NewsCreatorLName = n.Profile.profileLastName,
NewsID = n.newsID,
NewsCreatorID = n.userID,
NewsTitle = n.newsTitle,
CreatedDate = n.newsCreatedDate
})
.ToListAsync();
or like this:
public static async Task<List<NewsListViewModel>> GetAllNotPublished(string query)
{
if (query != "" && query != null)
{
var model = (from n in db.News
where n.newsPublished == false && n.newsTitle.Contains(query)
|| n.newsDescription.Contains(query)
orderby n.newsCreatedDate
select new NewsListViewModel
{
NewsCreatorFName = n.Profile.profileFirstName,
NewsCreatorLName = n.Profile.profileLastName,
NewsID = n.newsID,
NewsCreatorID = n.userID,
NewsTitle = n.newsTitle,
CreatedDate = n.newsCreatedDate
});
return await model.ToListAsync();
}
else
{
var model = (from n in db.News
where n.newsPublished == false
orderby n.newsCreatedDate
select new NewsListViewModel
{
NewsCreatorFName = n.Profile.profileFirstName,
NewsCreatorLName = n.Profile.profileLastName,
NewsID = n.newsID,
NewsCreatorID = n.userID,
NewsTitle = n.newsTitle,
CreatedDate = n.newsCreatedDate
});
return await model.ToListAsync();
}
}
I am probably going about this bass akwards and WAAAAY wrong but I have been battling with this for hours now trying to figure it out and can't find any examples that look similar.
One thing is that I can return either one just fine if it is in the ActionResult which is strange to me. This below works just fine, but I don't want it in the ActionResult. I would like to have the list retrieval portion in a separate method.
Thanks in advance for any help.
public async Task<ActionResult> PublishList(string query)
{
if (query != "" && query != null)
{
var model = (from n in db.News
where n.newsPublished == false && n.newsTitle.Contains(query)
|| n.newsDescription.Contains(query)
orderby n.newsCreatedDate
select new NewsListViewModel
{
NewsCreatorFName = n.Profile.profileFirstName,
NewsCreatorLName = n.Profile.profileLastName,
NewsID = n.newsID,
NewsCreatorID = n.userID,
NewsTitle = n.newsTitle,
CreatedDate = n.newsCreatedDate
});
return View(await model.ToListAsync());
}
else
{
var model = (from n in db.News
where n.newsPublished == false
orderby n.newsCreatedDate
select new NewsListViewModel
{
NewsCreatorFName = n.Profile.profileFirstName,
NewsCreatorLName = n.Profile.profileLastName,
NewsID = n.newsID,
NewsCreatorID = n.userID,
NewsTitle = n.newsTitle,
CreatedDate = n.newsCreatedDate
});
return View(await model.ToListAsync());
}
}

Related

How to create multiple configuration in Zerotouch? Configuration need enrollment token. Do we need multiple enrollment tokens for creating config?

Get Method of HardwarePolicy
[HttpGet]
[CustomAuthorization]
public IActionResult PolicyManagement(string profileType)
{
try
{
#region ResellerServiceAccountEMMOAuthCred
ServiceAccountCredential? credential;
string fileName = "service_account_key.json";
string path = Path.Combine(this.Environment.WebRootPath, "ZeroTouchCredJSON", fileName);
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(AndroidManagementService.ScopeConstants.Androidmanagement)
.UnderlyingCredential as ServiceAccountCredential;
}
// Create a zero-touch enrollment API service endpoint.
var service = new AndroidManagementService(new BaseClientService.Initializer
{
HttpClientInitializer = credential,
ApplicationName = ResourceMsg.EMMAppName
});
#endregion
ViewBag.MyPolicyName = string.Empty;
dynamic? policyId = null;
CommonPoliciesDto dto = new();
CommonPoliciesDto cpDto = new();
bool jFlag = false;
dynamic enterpriseNameFormat = "";
//fetch two profile types (Fully Manged & Work)
dto.ProfileTypeList = _iAdminMapper.GetProfileTypeList();
//fetch LoggedIn user info
var loggedInUserEmail = HttpContext.Session.GetString("LoggedInUserName");
var loggedInUserId = HttpContext.Session.GetString("LoggedInUserId");
//fetch enterprises based on loggedInUser
var enterprisesRes = _iEmmMapper.GetEnterprises().Where(x => x.AdminIdentityId == loggedInUserId).FirstOrDefault();
//get enterprise data based on loggedIn user google account
var enterpriseDatax = _iEmmMapper.GetEnterprises().Where(x => x.CustomerGoogleAccountId == enterprisesRes.CustomerGoogleAccountId).FirstOrDefault();
if (enterpriseDatax != null)
{
//bind myEnterpriseId in view page
ViewBag.MyEnterpriseeId = enterpriseDatax.EnterpriseId;
//DeviceList
//dto.DeviceList = _iAdminMapper.GetDropDevicesList(enterpriseDatax.EnterpriseId);
enterpriseNameFormat = string.Format("enterprises/{0}", enterpriseDatax.EnterpriseId);
//Fetch Current PolicyName
var myPolicyDatax = _iEmmMapper.GetCommonPolicies().Where(x => x.EnterpriseId == enterpriseDatax.EnterpriseId && x.CustomStatus2 == true).FirstOrDefault();
if(myPolicyDatax != null)
{
ViewBag.MyPolicyName = myPolicyDatax.PolicyName;
}
else
{
ViewBag.MyPolicyName = ResourceMsg.DefaultPolicy;
}
//fetch policy info based on enterpriseId and profileType
var policyData = _iEmmMapper.GetCommonPolicies().Where(x => x.EnterpriseId == enterpriseDatax.EnterpriseId && x.PolicyProfileType == profileType && x.PolicyType == ResourceMsg.Default).FirstOrDefault();
if (policyData != null)
{
policyId = policyData.PolicyId;
//managedplaystore
List<string> featuresList = new()
{
ResourceMsg.PLAY_SEARCH
};
//create web token for managed Google Play web UI; need reseller creds to generated token
var ParentFrameUrl = _iConfiguration.GetValue<string>("AppSetting:ParentFrameUrl");
WebToken webTokenInfo = service.Enterprises.WebTokens.Create(new DemoWebToken()
.SetParentFrameUrl(ParentFrameUrl)
.SetEnabledFeatures(featuresList), enterpriseNameFormat)
.Execute();
var webToken = webTokenInfo.Value;
TempData["WebToken"] = webToken;
//hardwaresettings
var result = _iEmmMapper.GetCommonPolicies().Where(x => x.PolicyId == policyId && x.PolicyType == ResourceMsg.Default).FirstOrDefault();
//applicationsettings | based on profileType
var resAppmodel = _iEmmMapper.GetApplicationPolicies().OrderByDescending(x => x.Id).FirstOrDefault(x => x.PolicyId == policyId);
//devicesettings
var resDevicemodel = _iEmmMapper.GetDevicePolicies().Where(x => x.EnterpriseId == enterpriseDatax.EnterpriseId && x.IsActive).FirstOrDefault();
if (profileType != null)
{
//If Managed Profile then perform on all settings
if (profileType == ResourceMsg.FullyManged)
{
if (result != null)
{
}
if (resAppmodel != null)
{
}
if (resDevicemodel != null)
{
}
//prepare commonpolicies vmodel to send to view
dto = new()
{
EnterpriseName = enterpriseDatax.EnterpriseNameRequested,
//populate policyNameList
//EnterpriseList = _iEmmMapper.GetActiveEnterprisesDropList(),
//populate enterprise list
EnterpriseList = _iEmmMapper.GetActiveEnterprisesDropList(),
//common policies
ProfileTypeList = _iAdminMapper.GetProfileTypeList(),
ProfileType = profileType,
//bindMyEnterpriseId in view
MyEnterpriseId = enterpriseDatax.EnterpriseId,
//hardware settings
DupWifiConfigDisabled = cpDto.DupWifiConfigDisabled,
DupMobileNetworksConfigDisabled = cpDto.DupMobileNetworksConfigDisabled,
DupBluetoothDisabled = cpDto.DupBluetoothDisabled,
DupUsbFileTransferDisabled = cpDto.DupUsbFileTransferDisabled,
MaximumTimeToLock = cpDto.MaximumTimeToLock,
AdjustVolumeDisabled = result != null ? result.AdjustVolumeDisabled : false,
ScreenCaptureDisabled = result != null ? result.ScreenCaptureDisabled : false,
StatusBarDisabled = result != null ? result.StatusBarDisabled : false,
BluetoothContactSharingDisabled = result != null ? result.BluetoothContactSharingDisabled : false,
ShareLocationDisabled = result != null ? result.ShareLocationDisabled : false,
WifiConfigDisabled = result != null ? result.WifiConfigDisabled : false,
MobileNetworksConfigDisabled = result != null ? result.MobileNetworksConfigDisabled : false,
AutoDateAndTimeZone = result != null ? result.AutoDateAndTimeZone : ResourceMsg.AUTO_DATEANDTIMEZONE_UNSPECIFIED,
KeyguardDisabled = result != null ? result.KeyguardDisabled : false,
CameraDisabled = result != null ? result.CameraDisabled : false,
//app settings
ApplicationName = cpDto.ApplicationName ?? string.Empty,
AppPackageName = cpDto.AppPackageName ?? string.Empty,
DupInstallType = cpDto.DupInstallType,
DupDefaultPermissionPolicy = cpDto.DupDefaultPermissionPolicy,
PackageList = _iEmmMapper.GetApplicationsList(),
//device mode settings
KioskMode = cpDto.KioskMode,
AppPolicyName = "",
PackageName = resDevicemodel != null? resDevicemodel.PackageName: "",
PackageId = cpDto.PackageId,
DupLockPowerButton = cpDto.DupLockPowerButton,
StatusBar = cpDto.StatusBar,
DupDisableDeviceSettings = cpDto.DupDisableDeviceSettings,
SystemNavigation = cpDto.SystemNavigation != null ? cpDto.SystemNavigation : ResourceMsg.SYSTEM_NAVIGATION_UNSPECIFIED,
DupEnableSystemErrorWarnings = cpDto.DupEnableSystemErrorWarnings,
IsDeleted = resDevicemodel != null ? resDevicemodel.IsDeleted: true,
//fetch defaultConfiguration status to show createConfiguration button when status is true
IsDefaultConfigurationSet = enterpriseDatax.IsDefaultConfigurationSet,
DeviceList = _iAdminMapper.GetDropDevicesList(enterpriseDatax.EnterpriseId)
};
if (jFlag)
{
//when profile dropdown changed
return Json(dto);
}
// TempData["PolicyApplied"] = TempData["PolicyApplied"];
return View(dto);
}
//If work Profile then perform on hardware and apps settings
if (profileType == ResourceMsg.Work)
{
if (result != null)
{
}
if (resAppmodel != null)
{
}
//prepare commonpolicies vmodel to send to view
dto = new()
{
EnterpriseName = enterpriseDatax.EnterpriseNameRequested,
//hardware settings
DupWifiConfigDisabled = cpDto.DupWifiConfigDisabled,
DupMobileNetworksConfigDisabled = cpDto.DupMobileNetworksConfigDisabled,
DupBluetoothDisabled = cpDto.DupBluetoothDisabled,
DupUsbFileTransferDisabled = cpDto.DupUsbFileTransferDisabled,
MaximumTimeToLock = cpDto.MaximumTimeToLock,
AdjustVolumeDisabled = result != null ? result.AdjustVolumeDisabled : false,
ScreenCaptureDisabled = result != null ? result.ScreenCaptureDisabled : false,
StatusBarDisabled = result != null ? result.StatusBarDisabled : false,
BluetoothContactSharingDisabled = result != null ? result.BluetoothContactSharingDisabled : false,
ShareLocationDisabled = result != null ? result.ShareLocationDisabled : false,
WifiConfigDisabled = result != null ? result.WifiConfigDisabled : false,
MobileNetworksConfigDisabled = result != null ? result.MobileNetworksConfigDisabled : false,
AutoDateAndTimeZone = result != null ? result.AutoDateAndTimeZone : ResourceMsg.AUTO_DATEANDTIMEZONE_UNSPECIFIED,
KeyguardDisabled = result != null ? result.KeyguardDisabled : false,
CameraDisabled = result != null ? result.CameraDisabled : false,
//app settings
ApplicationName = cpDto.ApplicationName ?? string.Empty,
AppPackageName = cpDto.AppPackageName ?? string.Empty,
DupInstallType = cpDto.DupInstallType,
DupDefaultPermissionPolicy = cpDto.DupDefaultPermissionPolicy,
PackageList = _iEmmMapper.GetApplicationsList(),
//common policies
EnterpriseList = _iEmmMapper.GetActiveEnterprisesDropList(),
ProfileTypeList = _iEmmMapper.GetProfileTypeList(),
ProfileType = profileType,
//bindMyEnterpriseId in view
MyEnterpriseId = enterpriseDatax.EnterpriseId,
//fetch defaultConfiguration status to show createConfiguration button when status is true
IsDefaultConfigurationSet = enterpriseDatax.IsDefaultConfigurationSet,
DeviceList = _iAdminMapper.GetDropDevicesList(enterpriseDatax.EnterpriseId)
};
if (jFlag)
{
//when profile dropdown changed
return Json(dto);
}
return View(dto);
}
}
}
}
// TempData["PolicyApplied"] = TempData["PolicyApplied"];
return View(dto);
}
catch (Exception ex)
{
_loggerManager.LogError($"Something went wrong inside CommonPolicies get action: {ex.Message}");
return View(new CommonPoliciesDto());
}
}
Post Mehtod
[HttpPost]
[CustomAuthorization]
public IActionResult PolicyManagement(CommonPoliciesDto commonPolicies)
{
try
{
dynamic PolicyAge = string.Empty;
dynamic policyResponse = string.Empty;
string myPolicyId = string.Empty;
//bind myEnterpriseId in view page
ViewBag.MyEnterpriseeId = commonPolicies.MyEnterpriseId;
//fetch UserIdentityId
var userLoggedId = _iEmmMapper.GetEnterprises().Where(x=> x.EnterpriseId == commonPolicies.MyEnterpriseId).Select(x => x.AdminIdentityId).FirstOrDefault();
if(userLoggedId != null)
{
commonPolicies.UserIdentityId = userLoggedId;
}
#region ResellerServiceAccountEMMOAuthCred
//read service a/c creds
ServiceAccountCredential? credential;
string fileName = "service_account_key.json";
string path = Path.Combine(this.Environment.WebRootPath, "ZeroTouchCredJSON", fileName);
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(AndroidManagementService.ScopeConstants.Androidmanagement)
.UnderlyingCredential as ServiceAccountCredential;
}
// Create a zero-touch enrollment API service endpoint.
var service = new AndroidManagementService(new BaseClientService.Initializer
{
HttpClientInitializer = credential,
ApplicationName = ResourceMsg.EMMAppName
});
#endregion
ModelState.Remove("PackageName");
if (ModelState.IsValid)
{
if (!string.IsNullOrEmpty(commonPolicies.MyEnterpriseId))
{
#region conditions
if (commonPolicies.AutoDateAndTimeZone == ResourceMsg.AUTO_DATEANDTIMEZONE_ENFORCED)
{
commonPolicies.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_ENFORCED;
}
else if (commonPolicies.AutoDateAndTimeZone == ResourceMsg.AUTO_DATEANDTIMEZONE_USERCHOICE)
{
commonPolicies.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_USERCHOICE;
}
else
{
commonPolicies.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_UNSPECIFIED;
}
//
if (commonPolicies.WifiMoblieData == 1)
{
commonPolicies.WifiConfigDisabled = false;
commonPolicies.MobileNetworksConfigDisabled = true;
}
else if (commonPolicies.WifiMoblieData == 2)
{
commonPolicies.MobileNetworksConfigDisabled = false;
commonPolicies.WifiConfigDisabled = true;
}
else
{
commonPolicies.WifiConfigDisabled = false;
commonPolicies.MobileNetworksConfigDisabled = false;
}
//
if (commonPolicies.DupBluetoothDisabled == 1)
{
commonPolicies.BluetoothDisabled = false;
}
else
{
commonPolicies.BluetoothDisabled = true;
commonPolicies.BluetoothContactSharingDisabled = true;
}
if (commonPolicies.DupUsbFileTransferDisabled == 1)
{
commonPolicies.UsbFileTransferDisabled = false;
}
else
{
commonPolicies.UsbFileTransferDisabled = true;
}
if (commonPolicies.MaximumTimeToLock > 0)
{
commonPolicies.MaximumTimeToLock *= 60000;
}
#endregion
#region formingPolicyIdFromPolicyName
//form Policy Id
string myPolicyName = commonPolicies.PolicyName.Trim();
bool flag = false;
foreach (var data in myPolicyName.ToCharArray())
{
if (data == ' ')
{
flag = true;
}
}
if (flag)
{
string[] polArr = myPolicyName.Split(' ');
foreach (var datax in polArr)
{
myPolicyId += datax + "_";
}
myPolicyId = myPolicyId.Remove(myPolicyId.Length - 1, 1);
//Console.WriteLine(myPolicyId);
}
else
{
myPolicyId = myPolicyName;
//Console.WriteLine(test);
}
#endregion
var entepriseParent = string.Format("enterprises/{0}", commonPolicies.MyEnterpriseId);
var policyName = string.Format("{0}/policies/{1}", entepriseParent, myPolicyId);
//Check if policy exist on server or not
//If policy not exist on server then it thru 404 error
try
{
policyResponse = service.Enterprises.Policies.Get(policyName).Execute();
}
catch (GoogleApiException gex)
{
//thru 404 error as this is the new policy for the server
PolicyAge = ResourceMsg.New;
}
if (PolicyAge != ResourceMsg.New)
{
//Policy exist on server
PolicyAge = ResourceMsg.Existing;
}
//condition for add policy
if (commonPolicies.ActionType != ResourceMsg.update)
{
//check if the policyId exist in both database and active in server
var IsPolicyExistOnDB = _iEmmMapper.GetCommonPolicies().Where(x => x.PolicyName.ToUpper() == commonPolicies.PolicyName.ToUpper().Trim() && x.PolicyId == myPolicyId && x.EnterpriseId == commonPolicies.MyEnterpriseId).Any();
//If PolicyExistOnDb or PolicyIsNewToServer then only thru policy exist error
if(IsPolicyExistOnDB || PolicyAge == ResourceMsg.Existing)
{
//If Policy Exist on server then can't create a policy again with the same name
TempData["Failure"] = ResourceMsg.PolicyNameAlreadyExist;
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ResourceMsg.PolicyNameAlreadyExist}");
return View(new EnterpriseDto());
}
else
{
//create a new policy in DB without policyId
//as PolicyId only generated by the server which need to be created during apply policy
//update data to common policies database table
commonPolicies.EnterpriseId = commonPolicies.MyEnterpriseId;
commonPolicies.PolicyId = "";
commonPolicies.PolicyName = commonPolicies.PolicyName;
commonPolicies.PolicyType = ResourceMsg.Custom;
//update into database
var result = _iAdminMapper.CreateUpdateHardwarePolicies(commonPolicies);
if (result == 0)
{
TempData["MsgCmnPolicies"] = ResourceMsg.PoliciesCreatedSuccessfully;
}
else
{
//this msg need to be removed
if (result == 1)
{
TempData["MsgCmnPolicies"] = ResourceMsg.PoliciesUpdatedSuccessfully;
}
}
}
}
else if (commonPolicies.ActionType == ResourceMsg.update)
{
//If the policy Exist on server then update the policy settings on server thru Policies.Patch endpoint
if(PolicyAge == ResourceMsg.Existing)
{
var newpolicyResponse = service.Enterprises.Policies.Patch(ConfigureCommonPolicies(commonPolicies), policyName).Execute();
commonPolicies.PolicyId = myPolicyId;
}
//update policy on local database
commonPolicies.EnterpriseId = commonPolicies.MyEnterpriseId;
commonPolicies.PolicyId = commonPolicies.PolicyId == null? string.Empty: commonPolicies.PolicyId;
commonPolicies.PolicyName = commonPolicies.PolicyName;
commonPolicies.PolicyType = ResourceMsg.Custom;
//update into database
var result = _iAdminMapper.CreateUpdateHardwarePolicies(commonPolicies);
if (result == 0)
{
TempData["MsgCmnPolicies"] = ResourceMsg.PoliciesCreatedSuccessfully;
}
else
{
if (result == 1)
{
TempData["MsgCmnPolicies"] = ResourceMsg.PoliciesUpdatedSuccessfully;
}
}
}
else
{
TempData["Failure"] = ResourceMsg.PolicyNameAlreadyExist;
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ResourceMsg.PolicyNameAlreadyExist}");
}
}
else
{
TempData["Failure"] = ResourceMsg.TryAgainContactTechnicalTeam;
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ResourceMsg.EnterpriseIdIsMissing}");
}
}
else
{
TempData["Failure"] = ResourceMsg.RequiredFieldsAreEmpty;
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ResourceMsg.RequiredFieldsAreEmpty}");
}
CommonPoliciesDto dto = new();
//fetch & bind two profile types (Fully Manged & Work) on view
dto.ProfileTypeList = _iAdminMapper.GetProfileTypeList();
var myEnterpriseName = _iEmmMapper.GetEnterprises().Where(x => x.EnterpriseId == commonPolicies.MyEnterpriseId).Select(x => x.EnterpriseNameRequested).FirstOrDefault();
//DeviceList
dto.DeviceList = _iAdminMapper.GetDropDevicesList(commonPolicies.MyEnterpriseId);
dto.EnterpriseName = myEnterpriseName;
//pass the dto model to view
return View(dto);
}
catch (GoogleApiException gex)
{
TempData["Failure"] = ResourceMsg.PolicyNotFoundContactTechnicalTeam;
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{gex.Message}");
return View(new EnterpriseDto());
}
catch (Exception ex)
{
TempData["Failure"] = ResourceMsg.TryAgainContactTechnicalTeam;
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{ex.Message}");
return View();
}
}
Apply the policy
[HttpPost]
[CustomAuthorization]
/// <summary>
/// This method is used to apply hardware policy.
/// </summary>
/// <returns></returns>
public IActionResult ApplyHardwarePolicy(string rwId, string devarr)
{
try
{
#region ResellerServiceAccountEMMOAuthCred
//read service a/c creds
ServiceAccountCredential? credential;
string fileName = "service_account_key.json";
string path = Path.Combine(this.Environment.WebRootPath, "ZeroTouchCredJSON", fileName);
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(AndroidManagementService.ScopeConstants.Androidmanagement)
.UnderlyingCredential as ServiceAccountCredential;
}
// Create a zero-touch enrollment API service endpoint.
var service = new AndroidManagementService(new BaseClientService.Initializer
{
HttpClientInitializer = credential,
ApplicationName = ResourceMsg.EMMAppName
});
#endregion
string PolicyAge = string.Empty;
CommonPoliciesDto model = new();
string myPolicyId = string.Empty;
string[] devicesArr = devarr.Split('|');
devicesArr = devicesArr.SkipLast(1).ToArray();
//fetch policy information based on rowId
var policyInfo = _iEmmMapper.GetCommonPolicies().Where(x => x.Id == Convert.ToInt32(rwId)).FirstOrDefault();
if(policyInfo != null)
{
//initialize model to assign apps into it
model.ApplicationDtoList = new List<ApplicationsDto>();
var appModel = new ApplicationsDto();
//prepare the model from database response to apply the policy on server
#region conditions
if (policyInfo.AutoDateAndTimeZone == ResourceMsg.AUTO_DATEANDTIMEZONE_ENFORCED)
{
model.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_ENFORCED;
}
else if (policyInfo.AutoDateAndTimeZone == ResourceMsg.AUTO_DATEANDTIMEZONE_USERCHOICE)
{
model.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_USERCHOICE;
}
else
{
model.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_UNSPECIFIED;
}
//
if (policyInfo.WifiConfigDisabled == false && policyInfo.MobileNetworksConfigDisabled == false)
{
model.WifiConfigDisabled = false;
model.MobileNetworksConfigDisabled = false;
}
if (policyInfo.WifiConfigDisabled == true)
{
model.WifiConfigDisabled = true;
model.MobileNetworksConfigDisabled = false;
}
else if (policyInfo.MobileNetworksConfigDisabled == true)
{
model.MobileNetworksConfigDisabled = true;
model.WifiConfigDisabled = false;
}
else
{
model.WifiConfigDisabled = false;
model.MobileNetworksConfigDisabled = false;
}
//
if (policyInfo.BluetoothDisabled == false)
{
model.BluetoothDisabled = false;
}
else
{
model.BluetoothDisabled = true;
model.BluetoothContactSharingDisabled = true;
}
//
if (policyInfo.UsbFileTransferDisabled == false)
{
model.UsbFileTransferDisabled = false;
}
else
{
model.UsbFileTransferDisabled = true;
}
//MaximumTimeToLock
model.MaximumTimeToLock = policyInfo.MaximumTimeToLock;
//adjustvolume
model.AdjustVolumeDisabled = policyInfo.AdjustVolumeDisabled;
//screencapture
model.ScreenCaptureDisabled = policyInfo.ScreenCaptureDisabled;
//statusbar
if(policyInfo.StatusBarDisabled == true)
{
model.StatusBarDisabled = true;
}
else
{
model.StatusBarDisabled = false;
}
//sharelocation
model.ShareLocationDisabled = policyInfo.ShareLocationDisabled;
//keyguard
model.KeyguardDisabled = policyInfo.KeyguardDisabled;
//camera
model.CameraDisabled = policyInfo.CameraDisabled;
#endregion
#region forming policyId from policyName
//form Policy Id
string myPolicyName = policyInfo.PolicyName.Trim();
bool flag = false;
foreach (var data in myPolicyName.ToCharArray())
{
if (data == ' ')
{
flag = true;
}
}
if (flag)
{
string[] polArr = myPolicyName.Split(' ');
foreach (var datax in polArr)
{
myPolicyId += datax + "_";
}
myPolicyId = myPolicyId.Remove(myPolicyId.Length - 1, 1);
//Console.WriteLine(myPolicyId);
}
else
{
myPolicyId = myPolicyName;
//Console.WriteLine(test);
}
#endregion
//Apply the selected policy on server
//check there is an active policy of the enterprise on server
var entepriseParent = string.Format("enterprises/{0}", policyInfo.EnterpriseId);
//var policyName = string.Format("{0}/policies/{1}", entepriseParent, myDefaumyPolicyIdltPolicyId);
var policyName = string.Format("{0}/policies/{1}", entepriseParent, myPolicyId);
//Check if policy exist on server or not
//If policy not exist on server then it thru 404 error
dynamic appList = string.Empty;
try
{
appList = service.Enterprises.Policies.Get(policyName).Execute();
}
catch (GoogleApiException gex)
{
//thru 404 error as this is the new policy for the server
PolicyAge = ResourceMsg.New;
}
//If policy is not the new policy then the existing policy
if (PolicyAge == string.Empty)
{
//If there no 404 exeception from server then the policy is the existing server policy
PolicyAge = ResourceMsg.Old;
}
//devicename
dynamic deviceNameAPI = string.Empty;
if (PolicyAge.Equals(ResourceMsg.New))
{
//create a new policy on the server with the formed policyId thru policies.patch endpoint
var newpolicyResponse = service.Enterprises.Policies.Patch(ConfigureCommonPolicies(model), policyName).Execute();
//loop thru each requested devices
foreach (var deviceId in devicesArr)
{
//form the deviceName API format
deviceNameAPI = string.Format("{0}/devices/{1}", entepriseParent, deviceId);
//Check device is exist on server or not
var deviceResponse = service.Enterprises.Devices.Get(deviceNameAPI).Execute();
//This device belongs to EMM Device; Full fledged path
//There is also Device class exist for Zerotouch device
Google.Apis.AndroidManagement.v1.Data.Device device = new Google.Apis.AndroidManagement.v1.Data.Device()
{
//Assign policyId to policyName
PolicyName = myPolicyId,
State = ResourceMsg.ACTIVE
};
//Apply the newly created policy on the requested devices thru device.patch endpont
var devicePatchResponse = service.Enterprises.Devices.Patch(device, deviceNameAPI).Execute();
}
//Update the local database with newly applied policy
}
else
{
if (PolicyAge.Equals(ResourceMsg.Old))
{
//No need to create a new policy on server
if (appList != null)
{
//set all hardware policies exist on server
//check if app list is null or not
if (appList.Applications != null)
{
//set all application policies exist from server
//fetching existing apps from the provided policy
foreach (var app in appList.Applications)
{
appModel = new ApplicationsDto()
{
PackageName = app.PackageName,
InstallType = app.InstallType,
DefaultPermissionPolicy = app.DefaultPermissionPolicy
};
model.ApplicationDtoList.Add(appModel);
}
}
}
//update the existing policy
var newpolicyResponse = service.Enterprises.Policies.Patch(ConfigureCommonPolicies(model), policyName).Execute();
//loop thru each requested devices
foreach (var deviceId in devicesArr)
{
//form the deviceName API format
deviceNameAPI = string.Format("{0}/devices/{1}", entepriseParent, deviceId);
//Check device is exist on server or not
var deviceResponse = service.Enterprises.Devices.Get(deviceNameAPI).Execute();
//This device belongs to EMM Device; Full fledged path
//There is also Device class exist for Zerotouch device
Google.Apis.AndroidManagement.v1.Data.Device device = new Google.Apis.AndroidManagement.v1.Data.Device()
{
//Assign policyId to policyName
PolicyName = myPolicyId,
State = ResourceMsg.ACTIVE
};
//Apply the newly created policy on the requested devices thru device.patch endpont
var devicePatchResponse = service.Enterprises.Devices.Patch(device, deviceNameAPI).Execute();
}
}
}
model.EnterpriseId = policyInfo.EnterpriseId;
model.PolicyName = policyInfo.PolicyName;
model.PolicyId = myPolicyId;
model.PolicyNameApiFormat = policyName;
model.Custom1 = DateTime.UtcNow.ToString();//PolicyAppliedDate
model.CustomStatus1 = true; //PolicyAppliedOnServerStatus
//model.CustomStatus2 = true; //IsThisCurrentPolicy
//update the policyInfo on local database
var result = _iAdminMapper.CreateUpdateHardwarePolicies(model);
if (result == 1)
{
//update the IsThisCurrentAppliedPolicy = customstatus2 to false for rest policies under the same policyId
//var res = _iAdminMapper.UpdateHardwarePoliciesStatus(model);
TempData["PolicyApplied"] = ResourceMsg.PoliciesAppliedSuccessfully;
}
else
{
TempData["PolicyApplied"] = ResourceMsg.ContactTechnicalTeam;
}
}
else
{
TempData["Failure"] = ResourceMsg.ContactTechnicalTeam;
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ResourceMsg.PolicyNotFound}");
return Json(new {success = false,message= ResourceMsg.ContactTechnicalTeam });
}
return Json(new { success = true, message = TempData["PolicyApplied"] });
}
catch (Exception ex)
{
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ex.Message}");
TempData["Failure"] = ResourceMsg.ContactTechnicalTeam;
return Json(new { success = false, message = ResourceMsg.ContactTechnicalTeam });
}
}
Method for Delete Policy
[HttpGet]
public IActionResult DeleteHardwarePolicy(string rwId)
{
try
{
if (rwId != null)
{
#region ResellerServiceAccountEMMOAuthCred
//read service a/c creds
ServiceAccountCredential? credential;
string fileName = "service_account_key.json";
string path = Path.Combine(this.Environment.WebRootPath, "ZeroTouchCredJSON", fileName);
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(AndroidManagementService.ScopeConstants.Androidmanagement)
.UnderlyingCredential as ServiceAccountCredential;
}
// Create a zero-touch enrollment API service endpoint.
var service = new AndroidManagementService(new BaseClientService.Initializer
{
HttpClientInitializer = credential,
ApplicationName = ResourceMsg.EMMAppName
});
#endregion
//Fetch enterpriseId based on deviceId where device is active
var policiesInfo = _iEmmMapper.GetCommonPolicies().Where(x => x.Id == Convert.ToInt32(rwId) && x.IsActive).FirstOrDefault();
if (policiesInfo != null)
{
//Fetch Default Policy
var defaultPolicyId = _iEmmMapper.GetCommonPolicies().Where(x => x.EnterpriseId == policiesInfo.EnterpriseId && x.PolicyProfileType == policiesInfo.PolicyProfileType && x.PolicyType == ResourceMsg.Default).Select(x=> x.PolicyId).FirstOrDefault();
//If policy is active policy for any devices then after deleting the sever will be updated with default policy
var entepriseParent = string.Format("enterprises/{0}", policiesInfo.EnterpriseId);
//Fetch DeviceList with ongoing deleted policy
//var DevicesList = service.Enterprises.Devices.List(entepriseParent);
var deviceList = _iEmmMapper.GetDevices().Where(x => x.PolicyId == policiesInfo.PolicyId && x.IsActive).ToList();
if(deviceList.Count > 0)
{
//apply all devices with default policy
foreach(var device in deviceList)
{
var deviceNameAPI = string.Format("{0}/devices/{1}", entepriseParent, device.DeviceId);
//Apply policy on device
Google.Apis.AndroidManagement.v1.Data.Device deviceBody = new Google.Apis.AndroidManagement.v1.Data.Device()
{
//Assign policyId to policyName
PolicyName = defaultPolicyId,
State = ResourceMsg.ACTIVE
};
//Apply the newly created policy on the requested devices thru device.patch endpont
var devicePatchResponse = service.Enterprises.Devices.Patch(deviceBody, deviceNameAPI).Execute();
}
}
//var policyName = string.Format("{0}/policies/{1}", entepriseParent, policiesInfo.PolicyId);
//var policyResponse = service.Enterprises.Policies.Get(policyName).Execute();
//if(policyResponse != null)
//{
// //If policy exist on server then set default hardware policy
// var appliedPolicyData = service.Enterprises.Policies.Patch(DefaultHardwarePolicies(policiesInfo.PolicyId), policyName).Execute();
//}
//soft delete policy from local database
var result = _iAdminMapper.SoftDeletePolicy(Convert.ToInt32(rwId));
if (result == 1)
{
TempData["MsgCmnPolicies"] = ResourceMsg.DeleteMsg;
return RedirectToAction("PolicyManagement", "Admin");
}
}
return RedirectToAction("PolicyManagement", "Admin");
}
return RedirectToAction("PolicyManagement", "Admin");
}
catch (Exception ex)
{
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ex.Message}");
return RedirectToAction("PolicyManagement", "Admin");
}
}
This method for get policy h/w policy
[HttpGet]
/// <summary>
/// This method is used to return hardware policies based on enterprise Id in json format.
/// </summary>
/// <param name="enterpriseId"></param>
/// <returns></returns>
public IActionResult GetjHardwarePolicies(string enterpriseId)
{
try
{
IList<CommonPoliciesDto> hardwarePoliciesList = new List<CommonPoliciesDto>();
List<SelectListItem> deviceDropList = new List<SelectListItem>();
SelectListItem hardwarePoliciy = new();
//fetch enterprise name
var enterpriseName = _iEmmMapper.GetEnterprises().Where(x=> x.EnterpriseId == enterpriseId).Select(x=> x.EnterpriseNameRequested).FirstOrDefault();
//fetch devices based on enterprise
var deviceList = _iEmmMapper.GetDevices().Where(x => x.EnterpriseId == enterpriseId && x.IsActive).ToList();
if(deviceList.Count > 0)
{
foreach(var device in deviceList)
{
hardwarePoliciy = new SelectListItem()
{
Text = device.Model,
Value = device.DeviceId
};
deviceDropList.Add(hardwarePoliciy);
};
}
if (enterpriseId != null)
{
//fetch list of custom hardware policies based on enterprise
var hardwarePoliciesListResponse = _iEmmMapper.GetCommonPolicies().Where(x => x.EnterpriseId.Equals(enterpriseId) && x.PolicyType == ResourceMsg.Custom && x.IsActive);
foreach (var policy in hardwarePoliciesListResponse)
{
policy.EnterpriseName = enterpriseName;
policy.DeviceList.AddRange(deviceDropList);
hardwarePoliciesList.Add(policy);
}
}
//List<SelectListItem> countries = this.Context.Customers.Where(x => x.Country != null)
//.Select(x => new SelectListItem
//{
// Text = x.Country,
// Value = x.Country
//}).Distinct().ToList();
return new JsonResult(hardwarePoliciesList);
}
catch (Exception ex)
{
string msgErr = "Error in " + this.GetType().ToString();
_loggerManager.LogError($"{msgErr}{ex.Message}");
return RedirectToAction("PolicyManagement", "Admin");
}
}
This method is used for edit policy
[HttpGet]
/// <summary>
/// This method used to Edit Hardware Setting modal by Id.
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public JsonResult jEditHardwareSettings(int id)
{
CommonPoliciesDto commonModel = new() { Id = id };
var responseHardwareModel = _iEmmMapper.GetCommonPolicies().Where(x => x.Id == id).FirstOrDefault();
if (responseHardwareModel != null)
{
#region Hardware Settings from database
//PolicyName
commonModel.PolicyName = responseHardwareModel.PolicyName;
//ProfileType
commonModel.PolicyProfileType = responseHardwareModel.PolicyProfileType;
//Blutooth
if (responseHardwareModel.BluetoothDisabled == false)
{
commonModel.DupBluetoothDisabled = 1;
}
else
{
commonModel.DupBluetoothDisabled = 0;
}
//USB
if (responseHardwareModel.UsbFileTransferDisabled == false)
{
commonModel.DupUsbFileTransferDisabled = 1;
}
else
{
commonModel.DupUsbFileTransferDisabled = 0;
}
//Wifi
if (responseHardwareModel.WifiConfigDisabled == false)
{
//enabled
commonModel.DupWifiConfigDisabled = 1;
}
else
{
//disabled
commonModel.DupWifiConfigDisabled = 0;
}
//MobileData
if (responseHardwareModel.MobileNetworksConfigDisabled == false)
{
commonModel.DupMobileNetworksConfigDisabled = 1;
}
else
{
commonModel.DupMobileNetworksConfigDisabled = 0;
}
//ScreenLockTime
if (responseHardwareModel.MaximumTimeToLock > 0)
{
commonModel.MaximumTimeToLock = responseHardwareModel.MaximumTimeToLock / 60000;
}
//LockVolume
commonModel.AdjustVolumeDisabled = responseHardwareModel.AdjustVolumeDisabled;
//ManageTimeZone
if (responseHardwareModel.AutoDateAndTimeZone == ResourceMsg.AUTO_DATEANDTIMEZONE_ENFORCED)
{
commonModel.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_ENFORCED;
}
else if (responseHardwareModel.AutoDateAndTimeZone == ResourceMsg.AUTO_DATEANDTIMEZONE_USERCHOICE)
{
commonModel.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_USERCHOICE;
}
else
{
commonModel.AutoDateAndTimeZone = ResourceMsg.AUTO_DATEANDTIMEZONE_UNSPECIFIED;
}
//ScreenCapture
commonModel.ScreenCaptureDisabled = responseHardwareModel.ScreenCaptureDisabled;
//StatusBar
commonModel.StatusBarDisabled = responseHardwareModel.StatusBarDisabled;
//BlutoothContactSharing
commonModel.BluetoothContactSharingDisabled = responseHardwareModel.BluetoothContactSharingDisabled;
//GPS
commonModel.ShareLocationDisabled = responseHardwareModel.ShareLocationDisabled;
//Keyguard
commonModel.KeyguardDisabled = responseHardwareModel.KeyguardDisabled;
//Camera
commonModel.CameraDisabled = responseHardwareModel.CameraDisabled;
#endregion
}
return Json(commonModel);
}

Use OUTER APPLY for SqlQuery<T> where T has IEnumerable properties

I am using a string sql query because of performance issues with using Linq. Due to a lot of outer applies, and a lot of where clauses using IN. The code in this sample is reduced for clarity here. I left off the IF-ELSE statements that added (or not) a lot of code to the where clause.
Here is my business object, it has an IEnumerable as a property.
public class AssetBO
{
public Guid AssetId { get; set; }
public Guid SiteId { get; set; }
public string Name { get; set; }
public IEnumerable<AssetDivisionBO> AssetDivisionInfo { get; set; }
}
And here is my string sql:
string SQL_Data = #"SELECT DISTINCT e.AssetId, e.SiteId, e.Name
FROM
Asset.vAssetLinkBox e
OUTER APPLY (
SELECT
ld.AssetDivisionId,
ld.SiteId,
ld.AssetId,
ld.DivisionId,
ld.IsDeleted,
ld.Created,
ld.LastModified,
ld.ModifiedByEmployeeId,
ld.CreatedByEmployeeId,
FROM Asset.AssetDivision ld
WHERE
ld.IsDeleted = 0
AND ld.AssetId = e.AssetId
) AS AssetDivisionInfo
WHERE
e.IsDeleted = 0";
I then run this:
var query = context.Database.SqlQuery<AssetBO>(SQL_Data);
List<AssetBO> assets = query.ToList<AssetBO>();
I would like to populate the IEnumerable AssetDivisionInfo, from the OUTER APPLY in the string SQL. Is this possible?
I get my AssetBO object, and the AssetDivisionInfo is null. Is there a way to map it?
EDIT: I was asked to supply the original Linq, so posting it here now. I need all of those OUTER APPLIES returned with the data.
public static List<ModuleView.AssetBO> Asset_GetList_ByRadFilter(COG_ContextDB context, RadFilter filter, string where_clause,
Guid Base_ContextSiteId, Guid Base_ContextEmployeeId, HashSet<Guid> PassedAssetIdList,
bool Base_ContextEmployee_IsForAllDivisions,
int PageNumber, int PageSize, string OrderByField, bool IsDescending,
bool IsRestrictedByDivision, HashSet<Guid?> Employee_DivisionIdList, out int RecordCount)
{
var interceptor = new Common.BLL.CommandInterceptorHelper();
System.Data.Entity.Infrastructure.Interception.DbInterception.Add(interceptor);
HashSet<Guid> IsForAll_AssetIdList = new HashSet<Guid>();
if (IsRestrictedByDivision == true)
{
//db hit, so calling only if IsRestrictedByDivision == true
IsForAll_AssetIdList = GetIsForAllDivisions_Assets(context, Base_ContextSiteId);
}
else
{
Base_ContextEmployee_IsForAllDivisions = false;
}
var query = from e in context.vAssetLinkBoxes
from cbu in context.Employees.Where(emp => emp.EmployeeId == e.CreatedByEmployeeId && emp.IsDeleted == false).DefaultIfEmpty()
//OUTER APPLY to get a list of AssetIds from AssetDivision table, that are in the employees DivisionIdList (divisions he has access to.) DEV-3504
let AssetIdList = (from dv in context.AssetDivisions.Where(div => div.AssetId == e.AssetId && div.IsDeleted == false && Employee_DivisionIdList.Contains(div.DivisionId)) select dv.AssetId).ToList<Guid>()
join assetUsageInfo in
(
from e in context.AssetUsages
from cbu in context.Employees.Where(emp => emp.EmployeeId == e.CreatedByEmployeeId && emp.IsDeleted == false).DefaultIfEmpty()
where e.IsDeleted == false
select new ModuleView.AssetUsageBO
{
AssetUsageId = e.AssetUsageId,
SiteId = e.SiteId,
AssetId = e.AssetId,
AssetUsageTypeId = e.AssetUsageTypeId,
ImportId = e.ImportId,
IsDeleted = e.IsDeleted,
Created = e.Created,
LastModified = e.LastModified,
ModifiedByEmployeeId = e.ModifiedByEmployeeId,
CreatedByEmployeeId = e.CreatedByEmployeeId,
CreatedByEmployeeName = (!string.IsNullOrEmpty(cbu.FirstName)) ? cbu.LastName + ", " + cbu.FirstName : cbu.LastName,
IsDirty = false,
IsNew = false,
}
) on e.AssetId equals assetUsageInfo.AssetId into assetUsageInfos
join assetExtendedFieldInfo in
(
from e in context.AssetExtendedFields
from cbu in context.Employees.Where(emp => emp.EmployeeId == e.CreatedByEmployeeId && emp.IsDeleted == false).DefaultIfEmpty()
where e.IsDeleted == false
orderby e.FieldName
select new ModuleView.AssetExtendedFieldBO
{
AssetExtendedFieldId = e.AssetExtendedFieldId,
SiteId = e.SiteId,
AssetId = e.AssetId,
FieldName = e.FieldName,
FieldLabel = e.FieldLabel,
FieldValue = e.FieldValue,
FieldDataType = e.FieldDataType,
IsDeleted = e.IsDeleted,
Created = e.Created,
LastModified = e.LastModified,
ModifiedByEmployeeId = e.ModifiedByEmployeeId,
CreatedByEmployeeId = e.CreatedByEmployeeId,
CreatedByEmployeeName = (!string.IsNullOrEmpty(cbu.FirstName)) ? cbu.LastName + ", " + cbu.FirstName : cbu.LastName,
IsDirty = false,
IsNew = false,
}
) on e.AssetId equals assetExtendedFieldInfo.AssetId into assetExtendedFieldInfos
join assetDivisionInfo in
(
from e in context.AssetDivisions
from d in context.Divisions.Where(emp => emp.DivisionId == e.DivisionId && emp.IsDeleted == false)
from a in context.Assets.Where(emp => emp.AssetId == e.AssetId && emp.IsDeleted == false)
from cbu in context.Employees.Where(emp => emp.EmployeeId == e.CreatedByEmployeeId && emp.IsDeleted == false).DefaultIfEmpty()
where e.IsDeleted == false
select new ModuleView.AssetDivisionBO
{
AssetDivisionId = e.AssetDivisionId,
SiteId = e.SiteId,
AssetId = e.AssetId,
DivisionId = e.DivisionId,
IsDeleted = e.IsDeleted,
Created = e.Created,
LastModified = e.LastModified,
ModifiedByEmployeeId = e.ModifiedByEmployeeId,
CreatedByEmployeeId = e.CreatedByEmployeeId,
CreatedByEmployeeName = (!string.IsNullOrEmpty(cbu.FirstName)) ? cbu.LastName + ", " + cbu.FirstName : cbu.LastName,
DivisionName = d.DivisionName,
AssetName = a.Name,
IsDirty = false,
IsNew = false,
}
) on e.AssetId equals assetDivisionInfo.AssetId into assetDivisionInfos
where e.SiteId == Base_ContextSiteId
&& (IsRestrictedByDivision == false || (IsRestrictedByDivision == true && (Base_ContextEmployee_IsForAllDivisions == true || AssetIdList.Contains(e.AssetId) || IsForAll_AssetIdList.Contains(e.AssetId)))) //from outer apply
select new ModuleView.AssetBO
{
AssetId = e.AssetId,
SiteId = e.SiteId,
AssetTypeId = e.AssetTypeId,
Name = e.Name,
Description = e.Description,
UniqueIdentity = e.UniqueIdentity,
StatusId = e.StatusId,
CompanyId = e.CompanyId,
Make = e.Make,
Model = e.Model,
Year = e.Year,
SerialNumber = e.SerialNumber,
PhoneNumber = e.PhoneNumber,
Email = e.Email,
IsActive = e.IsActive,
BlockedTimeIsEnabled = e.BlockedTimeIsEnabled,
ImportId = e.ImportId,
IsForAllDivisions = e.IsForAllDivisions,
IsDeleted = e.IsDeleted,
Created = e.Created,
LastModified = e.LastModified,
ModifiedByEmployeeId = e.ModifiedByEmployeeId,
AssetTypeName = e.AssetTypeName,
StatusName = e.StatusName,
CompanyName = e.CompanyName,
ModifiedByEmployeeName = e.ModifiedByEmployeeName,
AssetUsageTypeId = e.AssetUsageTypeId,
NumCaptainsOnBoard = (e.CaptainNum == null) ? 0 : (int)e.CaptainNum,
ActivityTimeInMin = e.TotalDurationInMin,
AssetUsageInfo = assetUsageInfos,
CreatedByEmployeeId = e.CreatedByEmployeeId,
CreatedByEmployeeName = (!string.IsNullOrEmpty(cbu.FirstName)) ? cbu.LastName + ", " + cbu.FirstName : cbu.LastName,
AssetExtendedFieldInfo = assetExtendedFieldInfos,
AssetDivisionInfo = assetDivisionInfos,
DivisionDelimitedString = "", //must be here to avoid error when sorting. Sort is done in BA code.
};
if (string.IsNullOrEmpty(where_clause))
{
where_clause = DataFilterBA.GetFilterWhereClause(context, filter, "ASSET", Base_ContextEmployeeId, Base_ContextSiteId, "LINQ");
}
int SkipRows = (PageNumber - 1) * PageSize;
if (PassedAssetIdList.Count == 0)
{
RecordCount = query.Where(where_clause).Select(d => d.AssetId).Distinct().Count();
//RecordCount = query.Where(where_clause).GroupBy(test => test.AssetId)
// .Select(grp => grp.FirstOrDefault()).Count();
query = query.Where(where_clause).OrderBy(OrderByField + (IsDescending ? " descending" : ""));
}
else
{
RecordCount = query.Where(x => PassedAssetIdList.Contains(x.AssetId)).Where(where_clause).Select(d => d.AssetId).Distinct().Count();
query = query.Where(x => PassedAssetIdList.Contains(x.AssetId)).Where(where_clause).OrderBy(OrderByField + (IsDescending ? " descending" : ""));
}
List<ModuleView.AssetBO> items = new List<ModuleView.AssetBO>();
if (PageSize == -1)
{
items = query.ToList<ModuleView.AssetBO>();
}
else
{
items = query.Skip(SkipRows).Take(PageSize).ToList<ModuleView.AssetBO>();
}
System.Data.Entity.Infrastructure.Interception.DbInterception.Remove(interceptor);
if (items != null && items.Count > 0)
{
items = items.GroupBy(test => test.AssetId)
.Select(grp => grp.FirstOrDefault())
.ToList();
return items;
}
return new List<ModuleView.AssetBO>();
}

How to instantly access the saved row

I was wrote some code in Asp MVC with EF technology, I have condition line to find row with today date if i was not found i add it to database and then use the saved row for another process, but i get error when i refresh error page it work fine ! i think my code can not work async!
any body can help me to found my wrong ?
public ActionResult LineRegimeSave(string breakFast, string snake1, string lunch, string snake2, string snake3,string dinner, string snake4,string adviseText, string docFooterId)
{
ApplicationDbContext myContext = new ApplicationDbContext();
var docFooter = docFooterId != "null" ? myContext.DocFooters.Single(d => d.Id.ToString() == docFooterId) : null;
var strLine="BreakFast,"+ breakFast + "/Snake1,"+ snake1 + "/Lunch,"+ lunch + "/Snake2,"+ snake2 + "/Snake3,"+ snake3 + "/Dinner,"+ dinner + "/Snake4,"+snake4;
TriageRecord getMedicalRecId;
var userId = Session["NID"];
var userProfile = myContext.UserProfiles.Single(b => b.NationalId.ToString() == userId.ToString());
getMedicalRecId = myContext.TriageRecords.Where(u => u.UserProfile.Id == userProfile.Id)
.OrderByDescending(d => d.DateTime).First();
if (getMedicalRecId.DateTime.Date != DateTime.Today)
{
TriageRecord insert = new TriageRecord
{
Bust = getMedicalRecId.Bust,
Diastolic = getMedicalRecId.Diastolic,
HeartRate = getMedicalRecId.HeartRate,
Systolic = getMedicalRecId.Systolic,
Height = getMedicalRecId.Height,
Weight = getMedicalRecId.Weight,
Wrist = getMedicalRecId.Wrist,
Waist = getMedicalRecId.Waist,
Hips = getMedicalRecId.Hips,
UserProfile = getMedicalRecId.UserProfile,
DateTime = DateTime.Now
};
insert.MedicalRecord = new MedicalRecord
{
TriageRecord = insert,
VisitDate = DateTime.Now,
};
myContext.TriageRecords.Add(insert);
myContext.SaveChanges();
getMedicalRecId = myContext.TriageRecords.Where(u => u.UserProfile.Id == userProfile.Id)
.OrderByDescending(d => d.DateTime).First();
getMedicalRecId.MedicalRecord.MedicalRecordDetails.Add
(
new MedicalRecordDetail
{
DateTime = DateTime.Now,
VisitMode = "LineDiet",
VisitSummary = strLine,
DocFooter = docFooter,
AdviseText = adviseText
}
);
myContext.SaveChanges();
}
else
{
getMedicalRecId.MedicalRecord.MedicalRecordDetails.Add
(
new MedicalRecordDetail
{
DateTime = DateTime.Now,
VisitMode = "LineDiet",
VisitSummary = strLine,
DocFooter = docFooter,
AdviseText = adviseText
}
);
myContext.SaveChanges();
}
return RedirectToAction("LineRegimePrint",new { id = getMedicalRecId.Id});
}
Error occur on this line :
getMedicalRecId.MedicalRecord.MedicalRecordDetails.Add
(
new MedicalRecordDetail
{
DateTime = DateTime.Now,
VisitMode = "LineDiet",
VisitSummary = strLine,
DocFooter = docFooter,
AdviseText = adviseText
}
);
Error text is : Null reference...
Thank you.
update :
insert.MedicalRecord = new MedicalRecord
{
TriageRecord = insert,
VisitDate = DateTime.Now,
};
myContext.TriageRecords.Add(insert);
myContext.SaveChanges();
Do i need to change this code ?
var a = insert.MedicalRecord = new MedicalRecord
{
TriageRecord = insert,
VisitDate = DateTime.Now,
};
myContext.TriageRecords.Add(insert);
myContext.MedicalRecords.Add(a);
So according to you the problem occurs whenever you try to add an item to the list, but it says the object is null, so you need to check for that.
public ActionResult LineRegimeSave(string breakFast, string snake1, string lunch, string snake2, string snake3,string dinner, string snake4,string adviseText, string docFooterId)
{
...
getMedicalRecId = myContext.TriageRecords.Where(u => u.UserProfile.Id == userProfile.Id).OrderByDescending(d => d.DateTime).First();
if(getMedicalRecId != null) {
if (getMedicalRecId.DateTime.Date != DateTime.Today)
{
...
insert.MedicalRecord = new MedicalRecord
{
TriageRecord = insert,
VisitDate = DateTime.Now,
MedicalRecordDetails = new List<MedicalRecordDetail>(){ new MedicalRecordDetail
{
DateTime = DateTime.Now,
VisitMode = "LineDiet",
VisitSummary = strLine,
DocFooter = docFooter,
AdviseText = adviseText
}
};
myContext.SaveChanges();
}
}
else
{
....
}
else
{
throw new Exception("The current user profile has no triage records!");
}
return RedirectToAction("LineRegimePrint",new { id = getMedicalRecId.Id});
}

asp.net mvc core A second operation was started on the context before the first operation is completed

I am using this code for authorization on controllers.
with [Authorize(Policy = "CustomRole")]
The thing happened that after 3 or 4 request it fails with
A second operation started on this context before a previous operation completed
public class CustomRoleRequirement : AuthorizationHandler<CustomRoleRequirement>, IAuthorizationRequirement
{
public CMSContext _context = new CMSContext();
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRoleRequirement requirement)
{
var routeobj = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
var c = routeobj.RouteData.Values.Values.ToList();
var keys = routeobj.RouteData.Values.Keys.ToList();
string area = "";
string id = "";
string controller = "";
string action = "";
string module = "";
foreach (var item in keys)
{
if (item=="area")
{
int indexs = keys.FindIndex(cc => cc == "area");
area = c[indexs].ToString();
}
else if (item == "id")
{
int indexs = keys.FindIndex(cc => cc == "id");
id = c[indexs].ToString();
}
else if (item == "controller")
{
int indexs = keys.FindIndex(cc => cc == "controller");
controller = c[indexs].ToString();
}
else if (item == "module")
{
int indexs = keys.FindIndex(cc => cc == "module");
module = c[indexs].ToString();
}
else if (item == "action")
{
int indexs = keys.FindIndex(cc => cc == "action");
action = c[indexs].ToString();
}
}
string modulelink = controller;
if (!string.IsNullOrEmpty(module))
{
modulelink = modulelink + "/" + module;
}
List<string> Roles = new List<string>();
int UserId = Auth.UserID;
string UserName = Auth.UserName;
if (UserName == "superadmin")
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
// apparently the error occurred here
var moduleobj = _context.AppModules.FirstOrDefault(q => q.Link == modulelink);
if (moduleobj != null)
{ // 69 role is assessing news module
//60 role is accessing page module
var RolesModulesobj = _context.AppRolesModules.FirstOrDefault(q => q.ModuleId == moduleobj.ModuleId && q.RolesId == Auth.RoleId);
if (RolesModulesobj != null)
{
string permissionsobj = RolesModulesobj.Permissions;
List<string> PermissionsListobj = permissionsobj.Split(',').Select(x => x.Trim()).ToList();
var FindFullAccess = PermissionsListobj.FirstOrDefault(q => q.Contains("FullAccess:true"));
if (FindFullAccess != null)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
var abc = PermissionsListobj.FirstOrDefault(q => q.Contains(action + ":true"));
if (abc != null)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
context.Fail();
return Task.CompletedTask;
}
}
}
}
}
The error occurred at this line above
var moduleobj = _context.AppModules.FirstOrDefault(q => q.Link == modulelink);
How can I make task wait before the second operation started in the method above?
You can't use a singleton DB context. You either create one each time you need one or you pool them.

How can I update related tables?

My project involves creating a new hotel room and 2 tables in my database will update. My tables are called RoomType and RoomFacility.
I can successfully update RoomType, but when I try to update RoomFacility and use RoomTypeID to make a new room facility, it fails. I always get 1 for my RoomFacilityID.
How can I update data for both tables, roomType and RoomFacility?
This is the code for my service to update my database
public void UpdateFacilityInRooms(List<int> FacilityIDs, int RoomTypeID)
{
List<HotelRoomFacility> hotelRoomFacilities =
_HotelRoomFacilityRopository.AsQueryable()
.Where(f => f.RoomTypeID == RoomTypeID).ToList();
foreach (int newRoomFacility in FacilityIDs)
{
if (hotelRoomFacilities.Where(h => h.RoomFacilityID == newRoomFacility).Count() == 0)
{
HotelRoomFacility facility = new HotelRoomFacility
{
RoomFacilityID = newRoomFacility,
RoomTypeID = RoomTypeID
};
_HotelRoomFacilityRopository.Add(facility);
}
}
_HotelRoomFacilityRopository.CommitChanges();
}
public RoomType NewRoom(int HotelID,int? RoomTypeID,
string RoomTypeName, string RoomTypeDescription)
{
RoomType room = new RoomType();
room.HotelID = HotelID;
room.RoomTypeID = RoomTypeID ?? 0;
room.RoomtypeName = RoomTypeName;
room.RoomTypeDescripton = RoomTypeDescription;
_RoomTypeRepository.Add(room);
_RoomTypeRepository.CommitChanges();
return room;
}
public RoomType UpdateRoom(int RoomTypeID, string RoomTypeName, string RoomTypeDescription, List<int> RoomFacilityIDs)
{
RoomType roomType = (from rt in _RoomTypeRepository.AsQueryable().Include(r => r.HotelRoomFacilities)
where rt.RoomTypeID == RoomTypeID
select rt).FirstOrDefault();
if (roomType == null)
return null;
roomType.RoomTypeName = RoomTypeName;
roomType.RoomTypeDescripton = RoomTypeDescription;
//Add New Room facilities
List<HotelRoomFacility> hotelRoomFacilities = _HotelRoomFacilityRopository.AsQueryable().Where(f => f.RoomTypeID == RoomTypeID).ToList();
foreach (int newRoomFacilityID in RoomFacilityIDs)
{
if (roomType.HotelRoomFacilities.Where(h => h.RoomFacilityID == newRoomFacilityID).Count() == 0)
{
roomType.HotelRoomFacilities.Add(new HotelRoomFacility
{
RoomFacilityID = newRoomFacilityID
});
}
}
foreach (HotelRoomFacility roomFacility in hotelRoomFacilities)
{
if (RoomFacilityIDs.Contains(roomFacility.RoomFacilityID) == false)
_HotelRoomFacilityRopository.Delete(roomFacility);
}
_RoomTypeRepository.Attach(roomType);
_RoomTypeRepository.CommitChanges();
return roomType;
}

Resources