2013-03-08 99 views
0

我有以下lamba查詢似乎總是返回所有記錄,即使當int?狀態pamameter不爲空且有效。任何人都知道爲什麼Enum過濾器不被尊重? 感謝您的閱讀!Enum的Lambda查詢過濾器

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 2013-03-08 22:25:07

+0

啊 - 已更新的答案。 – eouw0o83hf 2013-03-08 22:30:04

+0

這可能工作,但我從另一篇文章中發現,用明確的IQueryable registrationList替換「var」聲明並應用你的代碼它工作正常。非常感謝! – ChiliYago 2013-03-08 22:38:53

0

所有LINQ查詢返回一個IEnumerable<T>對象,但它們不會更改原始序列。

做到這一點:

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

@ eouw0o83hf耶看到他正在做的'選擇'..改變了它。謝謝 :-) – 2013-03-08 22:22:06

0

我認爲這可能是也聯繫到的lambda表達式中的變量關閉...

使用一個變量在內部像_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);