我遇到了一个问题,涉及根据3种不同类型的列表来源过滤列表。
假设我有一个非常大的列表,涵盖了美国的每家医院。所以我有3个表,一个状态表显示每个州的所有医院,一个Cities表显示每个州的城市中的所有医院,以及一个ZipCode表,我在其中显示一个邮政编码内的所有医院。
以下是我搜索的一些情景:
这是我到目前为止所拥有的:
(from hospitals in context.Hospitals)
where HospitalIDsByState.Contains(hospitals.state) &&
HospitalIDsByCity.Contains(hosptials.city) ||
HospitalIDsByZipcodes(hospitals.zipcode)
select hospitals)
我在这里遇到的问题是,如果我选择了州但我的城市是空的,我没有得到任何结果,我需要过滤,如果只选择了国家,我可以得到一个清单,如果城市是选中后,将过滤该状态的列表,如果选择了zipcodes,则会在搜索结果中包含该医院列表。
答案 0 :(得分:1)
由于延迟执行,您可以更动态地将查询拼凑在一起:
var query = context.Hospitals;
if (HospitalIDsByState.Any())
query = query.Where(h => HospitalIDsByState.Contains(h.state));
if (HospitalIDsByCity.Any())
query = query.Where(h => HospitalIDsByCity.Contains(h.city));
if (HospitalIDsByZipcodes.Any())
query = query.Where(h => HospitalIDsByZipcodes(h.zipcode));
return query;
这里的优点是只有相关的查询部分被推送到您的数据库,而您最终不会检查您不需要的内容。