按字段和值搜索过滤

时间:2016-04-18 21:57:00

标签: c# asp.net-mvc linq

我有4个班级:

public class Advertise {
    public int AdvertiseId {get;set;}
    public string Title {get;set;}
    Description
}

public class Fields {
    public int FieldId {get;set;}
    public string Name {get;set;}
}

public class Values {
    public int ValueId {get;set;}
    public string ValueName {get;set;}
}

public class FieldsValues {
    public int FieldValueId {get;set;}
    public int AdvertiseId {get;set;}
    public int FieldId {get;set;}
    public int ValueId {get;set;}
}

当用户过滤搜索并提交表单时,我会收到Request.QueryString [" field _" + fieldId],我会做一个foreach,如下所示:

var ads = from s in adsViewModel select s;

var fields = Db.Fields.GetAll();

foreach (var field in fields)
{
    int fieldValue;
    var requestField = Int32.TryParse(Request.QueryString["field_" + field.FieldId], out fieldValue);

    ads = ads.Where(s => s.FieldsValues.Any(x => x.ValueId == fieldValue));
}

很好用!

但是,当字段具有exacly标准时,搜索结果仅返回ADS。例如:

广告有两个字段:

客房= 7(ValueId)

停车位= 3(ValueId)

仅当用户选择房间= 7且停车位= 3

时,搜索才有效

如果用户在过滤器中仅选择rooms = 7,请求中的值为field_1=7, field_2=0,搜索返回null。

1 个答案:

答案 0 :(得分:3)

如果Request中的某个值为零,那么您的查询将等同于

ads = ads.Where(s => s.FieldsValues.Any(x => x.ValueId == 0));

这意味着ads将是一个空集合,假设您的表中没有ValueId == 0的行。

您可以使用if语句来测试任何值是否为零,如果是,则跳过查询

foreach (var field in fields)
{
    int fieldValue;
    var requestField = Int32.TryParse(Request.QueryString["field_" + field.FieldId], out fieldValue);
    if (fieldValue == 0)
    {
        continue;
    }
    ads = ads.Where(s => s.FieldsValues.Any(x => x.ValueId == fieldValue));
}