Странное поведение C # или это ошибка, которую я сделал? - PullRequest
0 голосов
/ 22 февраля 2012

Может кто-нибудь объяснить, почему это действие возвращает нулевые результаты, когда «0» передается параметру «page»:

[HttpPost]
public ActionResult SearchProperties(string id, string offerTypeID, string propertyTypeID, string page)
{
    int temp = 0;

    var props = from s in db.Properties
                    where s.Approved && s.Available
                    select s;

    if (!String.IsNullOrEmpty(id))
    {
        Int32.TryParse(id, out temp);
        props = from s in props
                    where s.PropertyType.PropertyTypeCategoryID == temp
                    select s;

    }

    if (!String.IsNullOrEmpty(offerTypeID))
    {
        Int32.TryParse(offerTypeID, out temp);
        props = from s in props
                    where s.OfferTypeID == temp
                    select s;
    }

    if (!String.IsNullOrEmpty(propertyTypeID))
    {
        Int32.TryParse(propertyTypeID, out temp);
        props = from s in props
                    where s.PropertyTypeID == temp
                    select s;
    }

    props = props.OrderBy(s => s.PropertyID);

    int i = 0, skip = 0;
    if (!String.IsNullOrEmpty(page))
    {
          Int32.TryParse(page, out temp);
          skip = temp * 10;
    }
    else
    {
         skip = 0;
    }

    props = props.Skip(skip).Take(10);


    var marks = (from s in props.ToList()
                         select s);
    return Json(new { markers = marks });
}

Это потому, что я повторно использую переменную temp для tryparse?
Пожалуйста, просветите меня, потому что этот фрагмент кода не вызывает каких-либо исключений или предостережений, а просто возвращает ноль записей ...

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Ваш код более сложен, чем должен быть. Упрощение этого должно привести к правильному результату или, по крайней мере, облегчить отладку. Позвольте каркасу сделать преобразование в int для вас. Если параметры не требуются, сделайте их обнуляемыми.

[HttpPost]
public ActionResult SearchProperties(int? id, int? offerTypeID, int? propertyTypeID, int? page)
{

    var props = from s in db.Properties
                    where s.Approved && s.Available
                    select s;

    if (id.HasValue)
    {
        props = from s in props
                    where s.PropertyType.PropertyTypeCategoryID == id.Value
                    select s;
    }

    if (offerTypeID.HasValue)
    {
        props = from s in props
                    where s.OfferTypeID == offerTypeID.Value
                    select s;
    }

    if (propertyTypeID.HasValue)
    {
        props = from s in props
                    where s.PropertyTypeID == propertyTypeID.Value
                    select s;
    }

    props = props.OrderBy(s => s.PropertyID);

    // use null coalescing operator to default to 0
    page = page ?? 0;

    int skip = page * 10;

    props = props.Skip(skip).Take(10);


    var marks = (from s in props.ToList()
                         select s);
    return Json(new { markers = marks });
}
0 голосов
/ 22 февраля 2012

Скорее всего, это связано с повторным использованием временной переменной в TryParse, без реального использования TryParse должным образом. Если какой-либо из параметров ненулевой, непустой, то независимо от того, что он будет пытаться ограничить ваш запрос, независимо от того, успешно ли выполнен TryParse или нет.

То, что вы должны делать, это иметь TryParse в условном выражении каждый раз, когда вы его вызываете.

if(Int32.TryParse(propertyTypeID, out temp))
{
    props = ...
}

Вы также можете замкнуть оценку в исходную условную, так как вы требуете ОБА, чтобы она была ненулевой или пустой, И преуспели с анализом:

if(!String.IsNullOrEmpty(id) && Int32.TryParse(id, out temp))
{
    props = ...
}

Так что, если не удастся выполнить синтаксический анализ строки до целого числа, он не будет беспокоиться об условном выражении.

...