0

I have the following lamba query that seems to always return all records even when the int? status pamameter is not null and valid. Anyone know why is the Enum filter not being honored? Thanks for reading!

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

3 回答 3

5

You need to point the result of the Where method back to the original object - it returns a new IEnumerable instead of doing an in-place change.:

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

In response to the update: you'll need to swap out where your order clause goes. Try:

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,

        });

Note the additional use of ThenBy - this will order by LastName then FirstName; the original would order by LastName, but then replace that ordering with FirstName.

于 2013-03-08T22:15:46.087 回答
0

All LINQ queries return an IEnumerable<T> objects, but they do not change the original sequence.

do this:

registrationList = registrationList.Where(s => s.Status == statusValue);
于 2013-03-08T22:20:53.520 回答
0

I think this might be also linked to closure of variables within lambda expressions...

use a variable internally like _internalfacilityID and assign the incoming parameter value to it first.

can you please check if this also helps to solve your problem even if you solved it using other ways.

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);
于 2013-03-10T20:03:37.453 回答