如何加载EF类及其关系类

时间:2016-08-05 14:38:34

标签: c# entity-framework

我有两张桌子:

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方法中的上下文。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

一旦启用了延迟加载(这是EF上的默认设置),有两种方法可以做到这一点。

1)使用扩展名" Include"

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

如果您的关系被配置为"必需"外键关系,EF会理解你正在做一个内部加入"

如果您的关系被配置为" Nullable" (不是必需的),EF会理解你正在做一个" Left Join"。

2)在枚举数据之前使用.Select选择相关数据。

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

在这种情况下,EF将了解您正在进行内部加入"比如使用"包含",但是,它只会返回你的"被选中"列,可以为更大的查询提供更好的性能。

修改1

Ps *:如果您无法访问"。包括"扩展,只需添加:

 using System.Data.Entity;