我有两张桌子:
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方法中的上下文。
答案 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;