如果 where 包含空字符串,LINQ 应该 return 没有记录

LINQ should return no records if where contains empty string

我正在尝试获取汽车描述过滤器文本所在的汽车记录。但如果过滤文本为空,我不应该 return 任何记录。以下代码有效,但是否有更好的方法来避免 cars.where(c => false)

public JsonResult GetCars(string cFilter)
{
    IQueryable<Cars> cars = CarService.GetCars();
    if (!string.IsNullOrEmpty(cFilter))
        cars = cars.Where(c => c.carDescr.Contains(cFilter));
    else
        cars = cars.Where(c => false);
    var carInfo = (from c in cars
                      select (new { id = c.CarID, description = c.CarID + "-" + c.carDescr })).ToList();
    return Json(carInfo, JsonRequestBehavior.AllowGet);
}

我不知道我错过了什么,但你只为 cFilter 设置了 nullnull

public JsonResult GetCars(string cFilter)
{

    IQueryable<Cars> cars = CarService.GetCars();
    if (!string.IsNullOrEmpty(cFilter))
     {cars = cars.Where(c => c.carDescr.Contains(cFilter));
       var carInfo = (from c in cars
                     select (new { id = c.CarID, description = c.CarID + "-" + c.carDescr })).ToList();
      return Json(carInfo, JsonRequestBehavior.AllowGet);
     }   
    else
       {

         return Json("", JsonRequestBehavior.AllowGet);
       } 


}

您可以完全跳过 CarService 的使用。

public JsonResult GetCars(string cFilter)
{
  IQueryable<Cars> cars;
  if (!string.IsNullOrEmpty(cFilter))
    cars = CarService.GetCars().Where(c => c.carDescr.Contains(cFilter));
  else
    cars = Enumerable.Empty<Cars>().AsQueryable();

  var carInfo = (from c in cars
                 select (new { id = c.CarID, description = c.CarID + "-" + c.carDescr })).ToList();
  return Json(carInfo, JsonRequestBehavior.AllowGet);
}

您可以缓存由 Enumreable.Empty<Cars>() 生成的 EnumerableQuery<Cars> 或者实际上只是 return 一个 JsonResult 用于任何情况下的空数组,因为任何空 json 数组是一个空 json 数组:

public JsonResult GetCars(string cFilter)
{
  if (!string.IsNullOrEmpty(cFilter))
    return Json(Enumerable.Empty<object>(), JsonRequestBehavior.AllowGet);

    var carInfo = (from c in CarService.GetCars()
                      where c.carDescr.Contains(cFilter)
                      select (new { id = c.CarID, description = c.CarID + "-" + c.carDescr })).ToList();
    return Json(carInfo, JsonRequestBehavior.AllowGet);
}

我会选择后者,但值得一提的是前者是两者中唯一适用的情况。

找到另一个解决方案。在 where 子句中添加了 cFilter empty 或 null 检查,它起作用了。

cars = cars.Where(c => c.carDescr.Contains(cFilter) && !string.IsNullOrEmpty(cFilter));

完成以下功能。

public JsonResult GetCars(string cFilter)
        {
            IQueryable<Cars> cars = CarService.GetCars();
            cars = cars.Where(c => c.carDescr.Contains(cFilter) && !string.IsNullOrEmpty(cFilter));
            var carInfo = (from c in cars
                           select (new { id = c.CarID, description = c.CarID + "-" + c.carDescr })).ToList();
            return Json(carInfo, JsonRequestBehavior.AllowGet);
        }