2013-03-08 3 views
0

У меня есть следующий запрос lamba, который всегда возвращает все записи, даже если int? status pamameter не является нулевым и действительным. Кто-нибудь знает, почему фильтр Enum не соблюдается? Спасибо за чтение!Lambda Query filter by Enum

public ActionResult GetArrivals(int facilityId, int? status) 
{ 
    var registrationList = db.Registrations 
      .Where(f => f.Facility.Id == facilityId) 
      .Where(a => a.ArrivalDateTime >= DateTime.Today) 
      .OrderBy(ln => ln.User.LastName) 
      .OrderBy(fn => fn.User.FirstName); 


    if (status.HasValue) 
    { 
     UrgentCareWaitWeb.Models.RegistrationStatus statusValue; 

     if (Enum.TryParse(status.Value.ToString(), out statusValue) == true) 
     { 
      registrationList 
       .Where(s => s.Status == statusValue); 
     } 
    } 



    // Project query to view 
    var pview = registrationList.Select(r => new PatientRegistrationsView() 
      { 
       ArrivalId = r.Id, 
       UserId = r.User.UserId, 
       UserName = r.User.UserName, 
       FirstName = r.User.FirstName, 
       LastName = r.User.LastName, 
       PrimaryPhone = r.User.PrimaryPhone, 
       SecondaryPhone = r.User.SecondaryPhone, 
       ArrivalDateTime = r.ArrivalDateTime, 
       PatientDataformId = r.PatientDataformId, 
       RegistrationStatus = r.Status, 

      }); 



    //if (Request.IsAjaxRequest()) 
    // return PartialView("_PatientRegistrations", model); 


    return View(pview); 
} 

ответ

5

Вы должны указать результат метода Where обратно к исходному объекту - она ​​возвращает новый IEnumerable а не делать в изменение месте .:

registrationList = registrationList.Where(s => s.Status == statusValue); 

В ответ на обновление : вам нужно поменять местами, где находится ваша позиция заказа. Попробуйте:

var registrationList = db.Registrations 
     .Where(f => f.Facility.Id == facilityId) 
     .Where(a => a.ArrivalDateTime >= DateTime.Today); 

if (status.HasValue) 
{ 
    UrgentCareWaitWeb.Models.RegistrationStatus statusValue; 

    if (Enum.TryParse(status.Value.ToString(), out statusValue) == true) 
    { 
     registrationList = registrationList 
      .Where(s => s.Status == statusValue); 
    } 
} 

var pview = registrationList 
      .OrderBy(ln => ln.User.LastName) 
      .ThenBy(fn => fn.User.FirstName) 
      .Select(r => new PatientRegistrationsView() 
     { 
      ArrivalId = r.Id, 
      UserId = r.User.UserId, 
      UserName = r.User.UserName, 
      FirstName = r.User.FirstName, 
      LastName = r.User.LastName, 
      PrimaryPhone = r.User.PrimaryPhone, 
      SecondaryPhone = r.User.SecondaryPhone, 
      ArrivalDateTime = r.ArrivalDateTime, 
      PatientDataformId = r.PatientDataformId, 
      RegistrationStatus = r.Status, 

     }); 

Примечание дополнительное использование ThenBy - это заказ на LastNameзатемFirstName; оригинал заказал бы LastName, но затем замените этот заказ FirstName.

+0

Очень ценный ответ. Я заменил этот код тем, который вы опубликовали, но он не компилируется. Невозможно неявно преобразовать тип 'System.Linq.IQueryable ' в 'System.Linq.IOrderedQueryable '. Явное преобразование существует (вы пропускаете листинг?) – ChiliYago

+0

Ah - обновленный ответ. – eouw0o83hf

+0

Это, вероятно, работает, но я нашел из другого сообщения, что замена объявления «var» на явный идентификатор регистрации IQueryable И применяя ваш код, он работает нормально. Спасибо огромное! – ChiliYago

0

Все запросы LINQ возвращают объекты IEnumerable<T>, но они не меняют исходную последовательность.

сделать это:

registrationList = registrationList.Where(s => s.Status == statusValue); 
+0

@ eouw0o83hf да увидел, что 'select' он делает .. изменил его. Благодаря :-) –

0

Я думаю, что это может быть также связано с закрытием переменных в лямбда-выражений ...

использовать переменную внутри как _internalfacilityID и присвоить входящий значение параметра в это сначала.

Не могли бы вы проверить, помогает ли это решить вашу проблему, даже если вы решили ее использовать другими способами.

public ActionResult GetArrivals(int facilityId, int? status) 
{ 
    int _internalfacilityID = facilityId; 
    var registrationList = db.Registrations 
     .Where(f => f.Facility.Id == **_internalfacilityID**) 
     .Where(a => a.ArrivalDateTime >= DateTime.Today) 
     .OrderBy(ln => ln.User.LastName) 
     .OrderBy(fn => fn.User.FirstName);