4

嗨,有人可以帮助我如何最好地在 LINQ 中使用 whereif

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);
     }

我认为我们可以通过使用 whereif 来使这个查询变得非常简单,对吧?有人可以帮助我如何使用 whereif 使这个查询变得简单吗?而不是检查 if (empid == "") ?

是否可以?

4

3 回答 3

6

我假设“whereif”应该是这种扩展方法。您不能使用它,因为它在 anIEnumerable<T>而不是在 a 上运行IQueryable<T>。结果将是您将从数据库中请求完整的雇员表并在应用程序的内存中执行过滤。那不是你想要的。但是,您可以使用条件运算符来实现此目的:

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>. 它看起来几乎相同,只是IEnumerable<T>替换为IQueryable<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;
}
于 2013-02-08T11:58:15.740 回答
5

如果 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);
于 2013-02-08T11:58:56.363 回答
0
.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();
于 2013-02-08T11:59:06.280 回答