LINQ - 必填字段,如果为null则不关心

时间:2012-05-24 16:31:20

标签: c# .net linq

我正在asp.net应用程序中构建搜索功能,我正在使用LINQ to SQL根据所选搜索条件检索数据。搜索条件是

  1. 国家/地区
  2. 城市
  3. 房间数
  4. 租金周期
  5. 只有第一个搜索条件Country是必填字段。但是,如果用户输入了标准2,3,4和/或5的值,则应考虑输入的值,并仅检索与所有输入的搜索条件匹配的结果。请注意,如果标准2,3,4和/或5中的一个保留为空(null),那么LINQ应该充当'DONT CARE'并返回该行。

    例如,如果输入的标准是:

    1. 国家=美国
    2. City = null
    3. 区= null
    4. 房间数量= null
    5. Rent Cycle = null
    6. 然后应返回所有具有Country == USA的行。

      另一个例子:

      1. 国家=英国
      2. City = null
      3. 区= null
      4. 房间数= 5
      5. Rent Cycle = null
      6. 然后应返回所有具有Country == UK和NumberOfRooms == 5的行。

        如何在LINQ to SQL中实现这一目标?

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

        var data = from x in db.Units where x.Country == coutnryID && /*PLEASE HELP!*/ select x;
        

3 个答案:

答案 0 :(得分:4)

试试这个(假设cityIddistrictIdroomsrentCycle是您要搜索的变量:

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;