在linq c#中深入查看过滤查询

时间:2014-02-21 17:49:54

标签: linq c#-4.0 asp.net-4.5

我遇到了一个问题,涉及根据3种不同类型的列表来源过滤列表。

假设我有一个非常大的列表,涵盖了美国的每家医院。所以我有3个表,一个状态表显示每个州的所有医院,一个Cities表显示每个州的城市中的所有医院,以及一个ZipCode表,我在其中显示一个邮政编码内的所有医院。

以下是我搜索的一些情景:

  • 如果我搜索纽约州和加州州的两个州,我会得到这些州的所有医院的清单。
  • 如果我添加几个城市,纽约和拉斯维加斯,那么过滤器会缩小到那些医院。
  • 如果我包含一个邮政编码,无论州或城市,如阿拉斯加的邮政编码,那么我会显示这些邮编(它仍然显示为纽约,纽约和加利福尼亚州拉斯维加斯选择的医院)。

这是我到目前为止所拥有的:

(from hospitals in context.Hospitals)
 where HospitalIDsByState.Contains(hospitals.state) &&
       HospitalIDsByCity.Contains(hosptials.city) ||
       HospitalIDsByZipcodes(hospitals.zipcode)
 select hospitals)
  • HospitalIDsByState来自先前查询的ID列表,这些ID在选定状态下过滤
  • HospitalIDsByCity是来自在所选城市上过滤的查询的ID列表
  • HospitalIDsByZipcodes是在所选邮政编码上过滤的查询中的ID列表

我在这里遇到的问题是,如果我选择了州但我的城市是空的,我没有得到任何结果,我需要过滤,如果只选择了国家,我可以得到一个清单,如果城市是选中后,将过滤该状态的列表,如果选择了zipcodes,则会在搜索结果中包含该医院列表。

1 个答案:

答案 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;

这里的优点是只有相关的查询部分被推送到您的数据库,而您最终不会检查您不需要的内容。