嗨,有人能帮我如何在LINQ 中最好地使用where if吗
IQueryable<Employee> empQuery;
if (empId == "")
{
empQuery = dbContext.Emps
.Include(x => x.Name)
.Include(x => x.Code)
.Where(x => x.Id == empId);
}
else
{
empQuery = dbContext.Emps
.Include(x => x.Name)
.Include(x => x.Code);
}
我认为我们可以通过使用where if right来使这个查询变得非常简单?有人能帮助我如何使用where使这个查询变得简单吗?而不是检查是否(empid=")?
有可能吗?
我假设"whereif"应该是这个扩展方法。您不能使用它,因为它在IEnumerable<T>
上运行,而不是在IQueryable<T>
上运行。结果是,您将从数据库中请求完整的employees表,并在应用程序的内存中执行筛选。这不是你想要的。然而,您可以使用条件运算符来实现这一点:
var empQuery = dbContext.Emps
.Include(x => x.Name)
.Include(x => x.Code)
.Where(x => empId == "" ? true : x.Id == empId);
请注意,这假设您在示例代码中实际指的是if(empId != "")
。如果你不是故意的,切换第二个和第三个操作数:
.Where(x => empId == "" ? x.Id == empId : true);
话虽如此,您当然可以为IQueryable<T>
创建相同的扩展方法。它看起来几乎相同,只是用IQueryable<T>
替换了IEnumerable<T>
,谓词改为表达式:
public static IQueryable<TSource> WhereIf<TSource>(
this IQueryable<TSource> source,
bool condition,
Expression<Func<TSource, bool>> predicate)
{
if (condition)
return source.Where(predicate);
else
return source;
}
如果empId不为空,我相信您希望通过empId进行筛选。简单的OR操作员将完成这项工作:
IQueryable<Employee> empQuery = dbContext.Emps
.Include(x => x.Name)
.Include(x => x.Code)
.Where(x => empId == "" || x.Id == empId);
您还可以动态构建查询:
IQueryable<Employee> empQuery = dbContext.Emps
.Include(x => x.Name)
.Include(x => x.Code);
if (empId != "")
empQuery = empQuery.Where(x => x.Id == empId);
.Where(x => x.Id == empId);
如果值是",那就没有意义了——你希望它返回什么?
var query = (from items in dbContext.Emps
where items.Id == empId
select new {
Name = items.Name,
Code = items.Code
}).ToList();