实体框架 - 如何在 List 元素中导航

本文关键字:元素 导航 List 框架 实体 | 更新日期: 2023-09-27 17:56:02


我有两个模型花园和花卉

public class Garden
{
    public int Id { get; set; }
    public string Name { get; set; } // Default value: Garden #[Id]
    // Location.
    public int LocationX { get; set; }
    public int LocationY { get; set; }
    // Flowers.
    public virtual List<Flower> Flowers { get; set; }
}
public class Flower
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Color { get; set; }
    public double Height { get; set; }
    public DateTime LastWatered { get; set; }
    public DateTime Planted { get; set; }
}
public class DataContext : DbContext
{
    public DbSet<Garden> Gardens { get; set; }
}

现在,我需要按 ID 选择一朵花。我做到了这一点,但我不确定这是好方法。我应该怎么做?你有什么关于这方面的文章吗?

var garden = _db.Gardens.Where(g => g.Id == gardenId).SingleOrDefault();
var flower = garden.Flowers.Where(f => f.Id == flowerId).SingleOrDefault();

实体框架 - 如何在 List<T> 元素中导航

我会建议这样做:

 var garden = _db.Gardens.SingleOrDefault(g => g.Id == gardenId);
 Flower flower = null;
 if (garden != null)
 {
     flower = garden.Flowers.SingleOrDefault(f => f.Id == flowerId);
 }     

不要先使用 Where 和 SingleOrDefault,然后再使用 SingleOrDefault。

编辑

正如@JoachimIsaksson建议的那样,我为花园添加了一个空引用检查,以避免可能的空引用异常。

您可以使用另一种语法重写它,并在一个数据库访问中执行整个选择。这也将消除对空检查的任何需求;

// this will find the flower with the correct id 
// only if it's also in the garden with the correct id
var result = (from garden in _db.Gardens
              from flower in garden.Flowers
              where garden.Id == gardenId 
                 && flower.Id == flowerId
              select flower).SingleOrDefault();