我有一个这样的查询
(from u in DataContext.Users
where u.Division == strUserDiv
&& u.Age > 18
&& u.Height > strHeightinFeet
select new DTO_UserMaster
{
Prop1 = u.Name,
}).ToList();
我想根据是否将这些条件提供给运行此查询的方法来添加各种条件,如年龄、身高。所有条件都将包括用户分区。如果提供了年龄,我想将其添加到查询中。类似地,如果提供了高度,我也想添加它。
如果这是使用sql查询完成的,我会使用字符串构建器将它们附加到主strSQL查询中。但在Linq中,我只能考虑使用IF条件,其中我将编写三次相同的查询,每个IF块都有一个额外的条件。有没有更好的方法来做这件事?
发布于 2012-06-05 00:31:47
如果您没有调用ToList()
并最终映射到DTO类型,则可以在执行过程中添加Where
子句,并在最后构建结果:
var query = from u in DataContext.Users
where u.Division == strUserDiv
&& u.Age > 18
&& u.Height > strHeightinFeet
select u;
if (useAge)
query = query.Where(u => u.Age > age);
if (useHeight)
query = query.Where(u => u.Height > strHeightinFeet);
// Build the results at the end
var results = query.Select(u => new DTO_UserMaster
{
Prop1 = u.Name,
}).ToList();
这仍然只会导致对数据库的一次调用,这将与在一次遍历中编写查询一样有效。
发布于 2016-03-11 10:07:20
我通常使用方法链接,但也有同样的问题。下面是我使用的扩展
public static IQueryable<T> ConditionalWhere<T>(
this IQueryable<T> source,
Func<bool> condition,
Expression<Func<T, bool>> predicate)
{
if (condition())
{
return source.Where(predicate);
}
return source;
}
这有助于避免断链。同样,使用相同的ConditionalOrderBy
和ConditionalOrderByDescending
也很有用。
发布于 2012-06-05 00:28:07
一种选择。
bool? age = null
(from u in DataContext.Users
where u.Division == strUserDiv
&& (age == null || (age != null && u.Age > age.Value))
&& u.Height > strHeightinFeet
select new DTO_UserMaster
{
Prop1 = u.Name,
}).ToList();
或者,您可以切换到linq的方法语法,并使用if条件将表达式附加到where子句。
https://stackoverflow.com/questions/10884651
复制相似问题