实体框架 - 如何在 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();
我会建议这样做:
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();