I have a Linq-2-SQL that updates the IEnumerable<Locum> LeftOverLocums
before the inner foreach
loop. I need to add one more boolean clause to the Where
portion but it has nothing to do with SQL DB. In fact, its a utility function. Please see the two function below. First one is the main function and the second is the one I need to embed in the Where
portion.
private void PreferenceFindJobs(ref JobCustomList jobList) {
List<KeyValuePair<long, DateTime>> AlreadyPrefferedLocums = new List<KeyValuePair<long, DateTime>>();
List<long> LocumsFilteringIDs = SchedulerMatrixStorage.Resources.Items.Select(col => Convert.ToInt64(col.Id)).ToList();
IEnumerable<Locum> LeftOverLocums = null;
foreach (JobCustom oneJob in jobList) {
LeftOverLocums = from locums in DbContext.Locums
join availabilities in DbContext.Availabilities on new {
OID = locums.OID
} equals new {
OID = availabilities.LocumID
}
where
LocumsFilteringIDs.Contains(locums.OID) &&
locums.IsActive == true &&
locums.IsLocumsExciteBan =开发者_高级运维= false &&
locums.IsGPHCBan == false &&
locums.IsRPSGBBan == false &&
locums.IsAdminMarkedComplete == true &&
availabilities.AvailabilityStatusID == 1 &&
availabilities.AvailableDate == oneJob.JobDate
select locums;
foreach (Locum oneLocum in LeftOverLocums) {
//This Locum can do this job
//Now check if he/she has been just alloted
if (AlreadyPrefferedLocums.Any(check => check.Key == oneLocum.OID && check.Value == oneJob.JobDate) == false) {
//No? Cool!
oneJob.LocumID = oneLocum.OID;
oneJob.LocumName = oneLocum.FirstName + " " + oneLocum.LastName;
//Add to the list to prevent double allocation
AlreadyPrefferedLocums.Add(new KeyValuePair<long, DateTime>(oneJob.LocumID, oneJob.JobDate));
} else {
continue;
}
}
}
}
public enum LocumType {
Pharmacist = 1,
Dispenser = 2,
AccreditedCheckingTechnician = 3
}
public static Boolean IsJobTypeOK(Enumerations.LocumType _Job, Enumerations.LocumType _Locum) {
bool ProcessResult;
switch (_Job) {
case Enumerations.LocumType.Pharmacist:
ProcessResult = _Locum == Enumerations.LocumType.Pharmacist;
break;
case Enumerations.LocumType.Dispenser:
ProcessResult = _Locum == Enumerations.LocumType.Dispenser;
break;
case Enumerations.LocumType.AccreditedCheckingTechnician:
ProcessResult = _Locum == Enumerations.LocumType.AccreditedCheckingTechnician || _Locum == Enumerations.LocumType.Dispenser;
break;
default:
ProcessResult = false;
break;
}
return ProcessResult;
}
This is my desired Where
clause:
where
IsJobTypeOK(oneJob.JobTypeID, locums.LocumTypeID) &&
LocumsFilteringIDs.Contains(locums.OID) &&
locums.IsActive == true &&
locums.IsLocumsExciteBan == false &&
locums.IsGPHCBan == false &&
locums.IsRPSGBBan == false &&
locums.IsAdminMarkedComplete == true &&
availabilities.AvailabilityStatusID == 1 &&
availabilities.AvailableDate == oneJob.JobDate
You dont have to use the method "IsJobTypeOK" at all.
where
(
(oneJob.JobTypeID == Enumerations.LocumType.AccreditedCheckingTechnician &&
locums.LocumTypeID == Enumerations.LocumType.Dispenser) ||
oneJob.JobTypeID == locums.LocumTypeID
) &&
LocumsFilteringIDs.Contains(locums.OID) &&
locums.IsActive == true &&
locums.IsLocumsExciteBan == false &&
locums.IsGPHCBan == false &&
locums.IsRPSGBBan == false &&
locums.IsAdminMarkedComplete == true &&
availabilities.AvailabilityStatusID == 1 &&
availabilities.AvailableDate == oneJob.JobDate
The best way to do this would be to filter the results after you call them from the database.
//Get you LeftOverLocums like you are now
//then
LeftOverLocums = LeftOverLocums
.Where(l => l.IsJobTypeOK(oneJob.JobTypeID, l.LocumTypeID))
Doesn't require anything extra on the database
精彩评论