代码之家  ›  专栏  ›  技术社区  ›  paprykarz

LINQ检查是否存在,但不等于任何值

  •  -1
  • paprykarz  · 技术社区  · 7 年前

    我试着从数据库中获取数据。我需要得到第一个产品的图像网址按最低的位置排序。操作正在索引视图上运行,其中每页有20条记录。获取具有第一个位置的图像url的代码:

    var firstImage = productImageRepository.Get().Where(i => i.ProductId == productId).OrderBy(i => i.Position).First();
    

    在我的数据库中,只有ID为1-7的产品才有图像。当循环在ID为8及更高的产品上时,我得到并出错:

    enter image description here

    是否有可能检查该产品的图像是否存在于数据库中?我知道我可以将它等于某个值,然后像if(firstimage)一样检查它!=null),但如果没有任何值的相等位置,我不知道如何执行此操作。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Josh Stevens    7 年前

    使用 FirstOrDefault() ,就像 First() 但如果没有元素与指定的条件匹配,则返回泛型集合的基础类型的默认值。

    然后,您可以检查是否定义了该值,该值告诉您数据库中是否存在任何项,在您的情况下 第一个默认值() 将返回 null 如果数据库中没有图像。

    你也可以使用 Any() 具有 第一()

    我的解决办法是

    var images = productImageRepository.Get().Where(i => i.ProductId == productId).OrderBy(i => i.Position);
    if (images.Any()) {
        // could just use First() here now if you wanted 
        // as Any() confirms there is values defined
        return Json(images.FirstOrDefault());
    } else {
       // throw a error or something. 
    }
    
        2
  •  0
  •   berndoJ    7 年前

    你可以试着替换 First() 具有 FirstOrDefault() 是的。如果集合中没有项目, 第一个默认值() 将返回类型的默认值。因此,cold之后有一个bool,指示第一个找到的元素是否有图像(假设first image的默认值是 null ,否则可通过 default(<Type of firstImage here>) )以下内容: bool imageExists = (firstImage != null);