如何使用Entity Framework从两个具有一对多关系的表中选择所有相关数据?

时间:2015-06-02 04:15:39

标签: c# asp.net entity-framework

我正在努力使用Entity Framework,因为我想选择与Item表中的一个项目相关的所有内容以及另外两个表Label和ItemLabel。 Item和ItemLabel表之间的关系是一对多。

我想编写IEnumberable List方法,它将检索与项目相关的所有数据。但是,我不知道如何检索ItemLabel表中的所有数据。

这是我的架构:

Item Table: ItemId, Title, Description
Label Table: LabelId, Title
ItemLabel Table: ItemLabelId, ItemId, LabelId, Description

这是数据访问层中的我的Item类

public int ItemId { get; set; }
public string Title { get; set; }
public string Description { get; set; }

public IEnumerable<Item> GetItems(Item itemObj)

    {

        List<Item> itemList = new List<Item>();

        using (TestEntities context = new TestEntities())

        {

            itemList = (from item in context.T_Item

                        select new Item()

                        {

                            ItemId = item.IdeaId,

                            Title = item.Title,

                            Description = item.Description,

                            Labels = item.T_ItemLabel.FirstOrDefault(), <<<<<< Error

                        }).ToList();

        }

        return itemList;

    }

请注意我使用的是Database First方法。

所以你能否告诉我如何获得与Item表中每个项目相关的所有标签?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

如果您正在选择实体类型,则可以选择它 - 您不必构建像您一样的对象。最简单的是var itemList = content.T_item,因为DbSet也是IEnumerable,但以下任何一个都可以工作:

var itemList = (from item in context.T_Item select item);
var itemList = context.T_item.Select(item => item);

然后,您只需使用导航属性Labels即可访问每个Item上的var labels = itemList.First().Labels。这些集合是延迟加载的,因此这涉及到数据库的另一次访问。将.Include("T_ItemLabel")添加到context.T_item以获取原始查询中的所有Labels