Построение предложения where для запроса LINQ в службе данных WCF - PullRequest
0 голосов
/ 09 мая 2011

У меня есть WebGet, которому передается один или несколько кодов провайдера. Для каждого кода поставщика мне нужно вернуть список пациентов для всех стационарных пациентов, где их код существует в качестве принимающего, обслуживающего или консультирующего поставщика.

Должно быть:

WHERE (inpatient = 1)
AND (dischargeddate IS NULL)
AND ((attending = 'SMITH') OR (admitting = 'SMITH') OR (consulting = 'SMITH'))

Цикл for не добавляет критерии к предложению where. Что я делаю неправильно??

Спасибо

    [WebGet]
    public IQueryable<vw_patient> GetInpatients(string providercode, string searchtext)
    {
        string[] providers = providercode.Split(new char[] { '|' });

        if (string.IsNullOrEmpty(searchtext))
        {
            var results = (from p in this.CurrentDataSource.vw_patient
                            where p.inpatient.Equals(true)
                            && p.dischargedate.Equals(null)
                            select p);

            foreach (string provider in providers)
            {
                results = results.Where<vw_patient>(e => e.attending.Equals(provider) || e.admitting.Equals(provider) || e.consulting.Contains(provider));
            }

            results.OrderBy(p => p.roomloc).ThenByDescending(p => p.patientname);
            return results;
        }
        else
        {
            var results = (from p in this.CurrentDataSource.vw_patient
                            where p.patientname.StartsWith(searchtext)
                            && p.inpatient.Equals(true)
                            && p.dischargedate.Equals(null)
                            select p);

            foreach (string provider in providers)
            {
                results = results.Where<vw_patient>(e => e.attending.Equals(provider) || e.admitting.Equals(provider) || e.consulting.Contains(provider));
            }

            results.OrderBy(p => p.roomloc).ThenByDescending(p => p.patientname);
            return results;
        }
    }

Ответы [ 2 ]

0 голосов
/ 10 мая 2011

Вместо

foreach (string provider in providers)
{
  results = results.Where<vw_patient>(e => e.attending.Equals(provider) || e.admitting.Equals(provider) || e.consulting.Contains(provider));
}

Вы можете сделать:

results.Where(e => providers.Contains(e.attending) || providers.Contains(e.admitting) || providers.Contains(e.admitting));
0 голосов
/ 09 мая 2011

Я думаю, вам может понадобиться поместить результаты запроса во временную переменную хранения (например, List<vw_patient>), а затем добавить ее в основной список. Что-то вроде: -

В существующем состоянии вы перезаписываете переменную results на каждой итерации цикла

List<vw_patient> fullList = new List<vw_patient>();

foreach (string provider in providers){
    results = results.Where<vw_patient>(
        e => e.attending.Equals(provider) || 
             e.admitting.Equals(provider) ||
             e.consulting.Contains(provider)
    );
    fullList.AddRange(result.ToList<vw_patient>());
} 
...