2013-03-08 101 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);