我有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。
答案 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));
}