我有两种型号花园和花卉
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();
答案 0 :(得分:0)
我会建议:
var garden = _db.Gardens.SingleOrDefault(g => g.Id == gardenId);
Flower flower = null;
if (garden != null)
{
flower = garden.Flowers.SingleOrDefault(f => f.Id == flowerId);
}
不使用Where first和SingleOrDefault,而是使用SingleOrDefault。
修改强>
正如@JoachimIsaksson建议的那样,我为garden添加了一个空引用检查以避免可能的NullReferenceException。
答案 1 :(得分:0)
您可以使用其他语法重写它,并在一个数据库访问中执行整个选择。这也将消除对空检查的任何需要;
// 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();