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

时间:2013-01-26 12:00:35

标签: c# asp.net-mvc entity-framework-4


我有两种型号花园和花卉

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

2 个答案:

答案 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();