我最近一直在尝试使用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”类型步骤手动构建查询之外,还有一种优雅的解决方法吗?
答案 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))