如何加载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方法中的上下文。
启用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();