我正在asp.net应用程序中构建搜索功能,我正在使用LINQ to SQL根据所选搜索条件检索数据。搜索条件是
只有第一个搜索条件Country是必填字段。但是,如果用户输入了标准2,3,4和/或5的值,则应考虑输入的值,并仅检索与所有输入的搜索条件匹配的结果。请注意,如果标准2,3,4和/或5中的一个保留为空(null),那么LINQ应该充当'DONT CARE'并返回该行。
例如,如果输入的标准是:
然后应返回所有具有Country == USA的行。
另一个例子:
然后应返回所有具有Country == UK和NumberOfRooms == 5的行。
如何在LINQ to SQL中实现这一目标?
这是我到目前为止所拥有的:
var data = from x in db.Units where x.Country == coutnryID && /*PLEASE HELP!*/ select x;
答案 0 :(得分:4)
试试这个(假设cityId
,districtId
,rooms
和rentCycle
是您要搜索的变量:
var data = from x in db.Units
where x.Country == countryId
&& (cityId == null || x.City == cityId)
&& (districtId == null || x.District == districtId)
&& (rooms == null || x.Rooms == rooms)
&& (rentCycle == null || x.RentCycle == rentCycle)
select x;
我基本上是说,如果要搜索的变量为空,则忽略它们,否则将它们与Unit
中的相应字段匹配。
答案 1 :(得分:1)
您可以分阶段构建查询:
var query = from x in db.Units where x.Country == countryId;
if (cityId != null) query = query.Where(x.City == cityId);
if (districtId != null) query = query.Where(x.City == districtId);
if (rooms != null) query = query.Where(x.Rooms == rooms);
if (rentCycle != null) query = query.Where(x.RentCycle == rentCycle);
var data = query.Select();
如果C#
稍微混乱,那将为您提供更高效的SQL答案 2 :(得分:1)
使用GetValueOrDefault,如果为null,则提供当前值的默认值:
var data = from x in db.Units
where x.Country == countryId
&& (x.City == cityId.GetValueOrDefault(x.City))
&& (x.District == districtId.GetValueOrDefault(x.District))
&& (x.Rooms == rooms.GetValueOrDefault(x.Rooms))
&& (x.RentCycle == rentCycle.GetValueOrDefault(x.RentCycle))
select x;