if语句-如何在LINQ中使用whereif



嗨,有人能帮我如何在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();

相关内容

  • 没有找到相关文章

最新更新