如何加载EF类及其';的关系类

本文关键字:关系 加载 EF 何加载 | 更新日期: 2023-09-27 18:01:12

我有两个表:

MY_TABLE
ID   CODE  VERSION  DESCRIPTION
1    AAA   1        A Test
MY_CHILD_TABLE
ID   CODE  VERSION  COLOR
1    AAA   1        Blue

两者都包含在我的EF模型中,并且在两个表上都有导航属性设置。

现在我有以下类来获取数据:

public static MyData GetMyData(string Code, string version)
{
    using (var context = new Entities())
    {
        return context.MY_TABLE.Where(x => x.MY_CODE == Code && x.MY_VERSION == version).FirstOrDefault();
    }
} 

如果我只想要MY_TABLE的数据,这很好。但是,我现在有一个场景,我希望返回MY_TABLE和MY_CHILD_TABLE数据。

我该如何返回该信息?
即,我希望能够达到以下效果:

var result = MyClass.GetMyData("aaa",1);
var color = result.NAV_PROP.Color;

如果我理解正确,这是不起作用的,因为我正在关闭GetMyData方法中的上下文。

如何加载EF类及其';的关系类

启用lazyloading(这是EF上的默认设置(后,有两种方法可以做到这一点。

1( 使用扩展名"Include">

context.Table.Include(t => t.RelatedTable).Where(x => ..Condition..).FirstOrDefault();

如果您的关系被配置为"必需"外键关系,EF将理解您正在进行"内部加入">

如果您的关系被配置为"可为空"(不是必需的(,EF将理解您正在进行"左联接"。

2( 使用选择相关数据。在枚举数据之前选择。

context.Table.Where(x = ..Conditions..).Select(s => 
     new { 
          RelatedTableColumn = s.RelatedTable.Column 
          ...
     }).FirstOrDefault();

在这种情况下,EF会理解你正在进行"内部联接",就像使用"Include"一样,但它只会返回你的"Selected"列,这会为更大的查询带来更好的性能。

编辑1

Ps*:如果你不能访问".Include"扩展,只需添加:

 using System.Data.Entity;

如果您有导航属性,只需包括它们:

return context.MY_TABLE.Include(x=>x.MY_CHILD_TABLEProperty).Where(x => x.MY_CODE == Code && x.MY_VERSION == version).FirstOrDefault();