2013-03-08 4 views
0

int 일 때 항상 모든 레코드를 반환하는 것으로 보이는 다음 lamba 쿼리가 있습니까? 상태 매개 변수가 null이 아니며 유효합니다. 누군가 Enum 필터가 존중받지 못하는 이유는 무엇입니까? 읽어 주셔서 감사합니다.람다 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 방법의 결과를 가리 키도록해야합니다 -이 업데이트에 대한 응답으로 현재 위치에서 변화 :

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

하고 대신 새로운 IEnumerable을 반환 : 당신은 당신의 주문 조항이 어디로 바꿔야 할 것인가. 시도 :

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의 추가 사용 -이 다음 LastNameFirstName으로 주문합니다; 원본은 LastName으로 주문하지만 그 주문은 FirstName으로 바꿉니다.

+0

응답에 많은 감사를드립니다. 내가 게시 한 코드로 그 코드를 대체했지만 컴파일되지 않습니다. 'System.Linq.IQueryable '형식을 'System.Linq.IOrderedQueryable '형식으로 암시 적으로 변환 할 수 없습니다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?) – ChiliYago

+0

Ah - 업데이트 된 답변입니다. – eouw0o83hf

+0

아마 작동하지만 다른 게시물에서 "var"선언을 명시 적 IQueryable registrationList로 바꾸고 코드를 적용하면 문제가 없습니다. 정말 고맙습니다! – ChiliYago

0

모든 LINQ 쿼리는 IEnumerable<T> 개체를 반환하지만 원래 시퀀스는 변경하지 않습니다. 나는이 또한 람다 표현식 내에서 변수의 폐쇄에 연결될 수 있다고 생각

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

@ eouw0o83hf 예, 그가하고있는'선택 '을 보았습니다. 감사 :-) –

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