4

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

  1. 国家
  2. 城市
  3. 房间的数量
  4. 租金周期

只有第一个搜索条件 Country 是必填字段。但是,如果用户输入了标准 2、3、4 和/或 5 的值,则应考虑输入的值,并且只检索与所有输入的搜索标准匹配的结果。请注意,如果条件 2、3、4 和/或 5 之一为空(null),则 LINQ 应充当“DONT CARE”并返回该行。

例如,如果输入的条件是:

  1. 国家 = 美国
  2. 城市 = 空
  3. 区=空
  4. 房间数 = null
  5. 租金周期 = null

然后应返回 Country == USA 的所有行。

另一个例子:

  1. 国家 = 英国
  2. 城市 = 空
  3. 区=空
  4. 房间数 = 5
  5. 租金周期 = null

然后应返回 Country == UK 和 NumberOfRooms == 5 的所有行。

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

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

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

3 回答 3

4

试试这个(假设cityId,districtId和是您要搜索的变量roomsrentCycle

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.

于 2012-05-24T16:36:03.830 回答
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

于 2012-05-24T16:55:32.280 回答
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; 
于 2012-05-24T17:03:22.897 回答