Bug: EntityFramework does not understand Tuple.Create

This commit is contained in:
Gary Sharp
2018-04-26 13:53:40 +10:00
parent b4a30061e3
commit 2cd6ddfa24
2 changed files with 96 additions and 53 deletions
@@ -221,22 +221,43 @@ namespace Disco.Services.Documents.ManagedGroups
} }
#region Device Scope #region Device Scope
private class ContainsAttachmentResult
{
public string Id;
public bool HasAttachment;
public string SerialNumber;
public IEnumerable<ContainsAttachmentDeviceResult> Devices;
}
private class ContainsAttachmentDeviceResult
{
public string Id;
public string SerialNumber;
}
private bool DeviceContainsAttachment(DiscoDataContext Database, string DeviceSerialNumber, out string DeviceAccountId) private bool DeviceContainsAttachment(DiscoDataContext Database, string DeviceSerialNumber, out string DeviceAccountId)
{ {
Tuple<string, bool> result; ContainsAttachmentResult result;
if (Configuration.FilterBeginDate.HasValue) if (Configuration.FilterBeginDate.HasValue)
{ {
result = Database.Devices result = Database.Devices
.Where(d => d.SerialNumber == DeviceSerialNumber && d.DeviceDomainId != null) .Where(d => d.SerialNumber == DeviceSerialNumber && d.DeviceDomainId != null)
.Select(d => Tuple.Create(d.DeviceDomainId, d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate))) .Select(d => new ContainsAttachmentResult()
{
Id = d.DeviceDomainId,
HasAttachment = d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate)
})
.FirstOrDefault(); .FirstOrDefault();
} }
else else
{ {
result = Database.Devices result = Database.Devices
.Where(d => d.SerialNumber == DeviceSerialNumber && d.DeviceDomainId != null) .Where(d => d.SerialNumber == DeviceSerialNumber && d.DeviceDomainId != null)
.Select(d => Tuple.Create(d.DeviceDomainId, d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId))) .Select(d => new ContainsAttachmentResult()
{
Id = d.DeviceDomainId,
HasAttachment = d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId)
})
.FirstOrDefault(); .FirstOrDefault();
} }
@@ -247,14 +268,14 @@ namespace Disco.Services.Documents.ManagedGroups
} }
else else
{ {
if (ActiveDirectory.IsValidDomainAccountId(result.Item1)) if (ActiveDirectory.IsValidDomainAccountId(result.Id))
{ {
DeviceAccountId = result.Item1 + "$"; DeviceAccountId = result.Id + "$";
return result.Item2; return result.HasAttachment;
} }
else else
{ {
DeviceAccountId = result.Item1 + "$"; DeviceAccountId = result.Id + "$";
return false; return false;
} }
} }
@@ -286,26 +307,30 @@ namespace Disco.Services.Documents.ManagedGroups
#region Job Scope #region Job Scope
private bool JobsContainAttachment(DiscoDataContext Database, int JobId, out string DeviceAccountId, out string DeviceSerialNumber) private bool JobsContainAttachment(DiscoDataContext Database, int JobId, out string DeviceAccountId, out string DeviceSerialNumber)
{ {
Tuple<string, string, bool> result; ContainsAttachmentResult result;
if (Configuration.FilterBeginDate.HasValue) if (Configuration.FilterBeginDate.HasValue)
{ {
result = Database.Jobs result = Database.Jobs
.Where(j => j.Id == JobId && j.Device.DeviceDomainId != null) .Where(j => j.Id == JobId && j.Device.DeviceDomainId != null)
.Select(j => new Tuple<string, string, bool>( .Select(j => new ContainsAttachmentResult()
j.Device.DeviceDomainId, {
j.Device.SerialNumber, Id = j.Device.DeviceDomainId,
j.Device.Jobs.Any(dj => dj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate)))) SerialNumber = j.Device.SerialNumber,
HasAttachment = j.Device.Jobs.Any(dj => dj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate))
})
.FirstOrDefault(); .FirstOrDefault();
} }
else else
{ {
result = Database.Jobs result = Database.Jobs
.Where(j => j.Id == JobId && j.Device.DeviceDomainId != null) .Where(j => j.Id == JobId && j.Device.DeviceDomainId != null)
.Select(j => new Tuple<string, string, bool>( .Select(j => new ContainsAttachmentResult()
j.Device.DeviceDomainId, {
j.Device.SerialNumber, Id = j.Device.DeviceDomainId,
j.Device.Jobs.Any(dj => dj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId)))) SerialNumber = j.Device.SerialNumber,
HasAttachment = j.Device.Jobs.Any(dj => dj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId))
})
.FirstOrDefault(); .FirstOrDefault();
} }
@@ -318,16 +343,16 @@ namespace Disco.Services.Documents.ManagedGroups
} }
else else
{ {
if (ActiveDirectory.IsValidDomainAccountId(result.Item1)) if (ActiveDirectory.IsValidDomainAccountId(result.Id))
{ {
DeviceAccountId = result.Item1 + "$"; DeviceAccountId = result.Id + "$";
DeviceSerialNumber = result.Item2; DeviceSerialNumber = result.SerialNumber;
return result.Item3; return result.HasAttachment;
} }
else else
{ {
DeviceAccountId = result.Item1 + "$"; DeviceAccountId = result.Id + "$";
DeviceSerialNumber = result.Item2; DeviceSerialNumber = result.SerialNumber;
return false; return false;
} }
} }
@@ -365,28 +390,32 @@ namespace Disco.Services.Documents.ManagedGroups
#region User Scope #region User Scope
private bool DeviceUserContainAttachment(DiscoDataContext Database, string UserId, out List<Tuple<string, string>> Devices) private bool DeviceUserContainAttachment(DiscoDataContext Database, string UserId, out List<Tuple<string, string>> Devices)
{ {
Tuple<bool, IEnumerable<Tuple<string, string>>> result; ContainsAttachmentResult result;
if (Configuration.FilterBeginDate.HasValue) if (Configuration.FilterBeginDate.HasValue)
{ {
result = Database.Users result = Database.Users
.Where(u => u.UserId == UserId) .Where(u => u.UserId == UserId)
.Select(u => Tuple.Create( .Select(u => new ContainsAttachmentResult()
u.UserAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate), {
u.DeviceUserAssignments HasAttachment = u.UserAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate),
Devices = u.DeviceUserAssignments
.Where(dua => !dua.UnassignedDate.HasValue && dua.Device.DeviceDomainId != null) .Where(dua => !dua.UnassignedDate.HasValue && dua.Device.DeviceDomainId != null)
.Select(dua => new Tuple<string, string>(dua.Device.DeviceDomainId, dua.Device.SerialNumber)))) .Select(dua => new ContainsAttachmentDeviceResult() { Id = dua.Device.DeviceDomainId, SerialNumber = dua.Device.SerialNumber })
})
.FirstOrDefault(); .FirstOrDefault();
} }
else else
{ {
result = Database.Users result = Database.Users
.Where(u => u.UserId == UserId) .Where(u => u.UserId == UserId)
.Select(u => Tuple.Create( .Select(u => new ContainsAttachmentResult()
u.UserAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId), {
u.DeviceUserAssignments HasAttachment = u.UserAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId),
Devices = u.DeviceUserAssignments
.Where(dua => !dua.UnassignedDate.HasValue && dua.Device.DeviceDomainId != null) .Where(dua => !dua.UnassignedDate.HasValue && dua.Device.DeviceDomainId != null)
.Select(dua => new Tuple<string, string>(dua.Device.DeviceDomainId, dua.Device.SerialNumber)))) .Select(dua => new ContainsAttachmentDeviceResult() { Id = dua.Device.DeviceDomainId, SerialNumber = dua.Device.SerialNumber })
})
.FirstOrDefault(); .FirstOrDefault();
} }
@@ -397,11 +426,11 @@ namespace Disco.Services.Documents.ManagedGroups
} }
else else
{ {
Devices = result.Item2 Devices = result.Devices
.Where(d => ActiveDirectory.IsValidDomainAccountId(d.Item1)) .Where(d => ActiveDirectory.IsValidDomainAccountId(d.Id))
.Select(d => Tuple.Create(d.Item1 + "$", d.Item2)) .Select(d => new Tuple<string, string>(d.Id + "$", d.SerialNumber))
.ToList(); .ToList();
return result.Item1; return result.HasAttachment;
} }
} }
@@ -198,26 +198,36 @@ namespace Disco.Services.Documents.ManagedGroups
} }
#region Device Scope #region Device Scope
private class ContainsAttachmentResult
{
public string Id;
public bool HasAttachment;
}
private bool DeviceContainsAttachment(DiscoDataContext Database, string DeviceSerialNumber, out string UserId) private bool DeviceContainsAttachment(DiscoDataContext Database, string DeviceSerialNumber, out string UserId)
{ {
Tuple<string, bool> result; ContainsAttachmentResult result;
if (Configuration.FilterBeginDate.HasValue) if (Configuration.FilterBeginDate.HasValue)
{ {
result = Database.Devices result = Database.Devices
.Where(d => d.SerialNumber == DeviceSerialNumber && d.AssignedUser != null) .Where(d => d.SerialNumber == DeviceSerialNumber && d.AssignedUser != null)
.Select(d => Tuple.Create( .Select(d => new ContainsAttachmentResult()
d.AssignedUserId, {
d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate))) Id = d.AssignedUserId,
HasAttachment = d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate)
})
.FirstOrDefault(); .FirstOrDefault();
} }
else else
{ {
result = Database.Devices result = Database.Devices
.Where(d => d.SerialNumber == DeviceSerialNumber && d.AssignedUser != null) .Where(d => d.SerialNumber == DeviceSerialNumber && d.AssignedUser != null)
.Select(d => Tuple.Create( .Select(d => new ContainsAttachmentResult()
d.AssignedUserId, {
d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId))) Id = d.AssignedUserId,
HasAttachment = d.DeviceAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId)
})
.FirstOrDefault(); .FirstOrDefault();
} }
@@ -228,8 +238,8 @@ namespace Disco.Services.Documents.ManagedGroups
} }
else else
{ {
UserId = result.Item1; UserId = result.Id;
return result.Item2; return result.HasAttachment;
} }
} }
@@ -262,24 +272,28 @@ namespace Disco.Services.Documents.ManagedGroups
#region Job Scope #region Job Scope
private bool JobsContainAttachment(DiscoDataContext Database, int JobId, out string UserId) private bool JobsContainAttachment(DiscoDataContext Database, int JobId, out string UserId)
{ {
Tuple<string, bool> result; ContainsAttachmentResult result;
if (Configuration.FilterBeginDate.HasValue) if (Configuration.FilterBeginDate.HasValue)
{ {
result = Database.Jobs result = Database.Jobs
.Where(j => j.Id == JobId && j.UserId != null) .Where(j => j.Id == JobId && j.UserId != null)
.Select(j => Tuple.Create( .Select(j => new ContainsAttachmentResult()
j.UserId, {
j.User.Jobs.Any(uj => uj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate)))) Id = j.UserId,
HasAttachment = j.User.Jobs.Any(uj => uj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate))
})
.FirstOrDefault(); .FirstOrDefault();
} }
else else
{ {
result = Database.Jobs result = Database.Jobs
.Where(j => j.Id == JobId && j.UserId != null) .Where(j => j.Id == JobId && j.UserId != null)
.Select(j => Tuple.Create( .Select(j => new ContainsAttachmentResult()
j.UserId, {
j.User.Jobs.Any(uj => uj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId)))) Id = j.UserId,
HasAttachment = j.User.Jobs.Any(uj => uj.JobAttachments.Any(a => a.DocumentTemplateId == DocumentTemplateId))
})
.FirstOrDefault(); .FirstOrDefault();
} }
@@ -290,8 +304,8 @@ namespace Disco.Services.Documents.ManagedGroups
} }
else else
{ {
UserId = result.Item1; UserId = result.Id;
return result.Item2; return result.HasAttachment;
} }
} }