0


我有两个模型 Garden 和 Flower

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();
4

2 回答 2

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 再使用 SingleOrDefault,只需使用 SingleOrDefault。

编辑

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

于 2013-01-26T12:03:06.887 回答
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();
于 2013-01-26T12:26:39.467 回答