更聪明的where子句?

时间:2011-09-23 10:47:28

标签: c# linq linq-to-sql

我最近一直在尝试使用LINQ to SQL,并且有一个简单的问题。 基本前提是我有一个搜索请求,其中包含一个Make和Model,我用它来搜索包含汽车的数据库。

我的Where子句的表达式如下所示:

.Where(c => c.make == search.make  && c.model == search.model)

当我的搜索同时包含品牌和型号时,这很好。当它只包含一个make(反之亦然)而不是两个搜索字段时,就会出现问题。我想让它返回所有制造的汽车,然而它却没有返回。

我假设这是因为它正在寻找make加上一个null或空的模型?

除了使用一系列“if not null append to query”类型步骤手动构建查询之外,还有一种优雅的解决方法吗?

8 个答案:

答案 0 :(得分:3)

你试过了吗?

.Where(c => (search.make == null || c.make == search.make)  && (search.model == null || c.model == search.model))

更新:对于一般问题和清洁解决方案实际上有一个很好的处理方法,在这里: LINQ to SQL Where Clause Optional Criteria。共识似乎是扩展方法最简洁。

答案 1 :(得分:2)

.Where(c => (search.make == null || c.make == search.make) && 
            (search.model == null || c.model == search.model))

答案 2 :(得分:1)

IMO,拆分它:

IQueryable<Car> query = ...
if(!string.IsNullOrEmpty(search.make))
    query = query.Where(c => c.make == search.make);
if(!string.IsNullOrEmpty(search.model))
    query = query.Where(c => c.model== search.model);

这产生了最合适的TSQL,因为它不包含冗余的WHERE子句或其他参数,允许RDBMS优化(单独)“make”,“model”和“make and model”查询。

答案 3 :(得分:0)

这应该有用。

.Where(c => 
    (search.make == null || c.make == search.make) &&
    (search.model == null || c.model == search.model))

答案 4 :(得分:0)

你可以这样写:

.Where(c => c.make == search.make ?? c.make && c.model == search.model ?? c.model)

答案 5 :(得分:0)

.Where(c => (string.IsNullOrEmpty(c.make) || c.make == search.make) && 
            (string.IsNullOrEmpty(c.model) || c.model == search.model))

答案 6 :(得分:0)

.Where(c => (string.IsNullOrEmpty(search.make) || c.make == search.make) &&
            (string.IsNullOrEmpty(search.model) || c.model == search.model))

假设属性是字符串。

答案 7 :(得分:0)

Where(c => (search.make == null || c.make == search.make) && 
           (search.model == null || c.model == search.model))