Добавление не-SQL, где предложение к LINQ-2-SQL - PullRequest
0 голосов
/ 15 марта 2011

У меня есть Linq-2-SQL, который обновляет IEnumerable<Locum> LeftOverLocums перед внутренним циклом foreach.Мне нужно добавить еще одно логическое предложение в часть Where, но оно не имеет ничего общего с базой данных SQL.На самом деле, это функция полезности.Пожалуйста, смотрите две функции ниже.Первая - это основная функция, а вторая - та, которую мне нужно вставить в часть Where.

    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;
    }

Это мое желаемое предложение Where:

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

Ответы [ 2 ]

0 голосов
/ 17 марта 2011

Лучший способ сделать это - отфильтровать результаты после вызова их из базы данных.

//Get you LeftOverLocums like you are now
//then
LeftOverLocums = LeftOverLocums
                 .Where(l => l.IsJobTypeOK(oneJob.JobTypeID, l.LocumTypeID))

Не требуется ничего дополнительного в базе данных

0 голосов
/ 15 марта 2011

Вам вообще не нужно использовать метод "IsJobTypeOK".

<code>
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
...