如何使用linq to sql和ef查询导航属性

时间:2010-10-04 20:39:05

标签: asp.net linq-to-sql entity-framework objectcontext

我正在尝试使用linq to sql 强类型查询3个ef对象。与产品和类别存在一对多的关系。我的类包含导航属性,看起来像这样。

public partial class Product
{

public int ID {get;set;}
public string Name {get;set;}
public virtual ICollection<Group> NpGroup {get;set;}
}

public partial class Category
{
public int ID {get;set;}
public string Name {get;set;}
public virtual ICollection<Group> NpGroup {get;set;}
}

public partial class Group
{
public int ID {get;set;}
public int ProductID {get;set;}
public int CategoryID {get;set;}
public virtual Product NpProduct {get;set;}
public virtual Category NpCategory {get;set;}
}

试图避免基于字符串的.Include(),我如何构造一个返回等于ProductID“1”的组的查询,还包括产品和类别的名称?

类似的东西:

var context = ObjectContext.CurrentObjectContext;
    var query = from c in context.Group
    where c.ProductID == 1
    //Include the names of the product and category of the group record (c.NpProduct.Name etc.)
    select c;

我可能错过了穿过森林的树木,但我似乎无法获得ObjectContext.LoadProperty的语法(如果这是正确的方法)。

有什么想法?感谢。

2 个答案:

答案 0 :(得分:0)

首先,我怀疑你是否正在使用 L2SQL和EF,所以尽量不要混淆人们。

无论如何,使用EF - 有两种方法可以加载导航属性:

1 - 渴望加载

q.Include("NavPropertyName")

2 - 显式加载

*After* running your above query - use q.NavPropertyName.Load()

差异是选项2)导致2个查询,选项1导致FK上的内部联接。

我可以同情你不愿意使用Include因为'魔术字符串' - 我不确定为什么EF团队没有强力输入它们,但是我确定有充分的理由。

有关加载/加入here的更多信息。

HTH

答案 1 :(得分:0)

我认为我们都讨厌在.include()语句中使用类型化字符串。

我已经开始使用枚举来表示表名,只是为了避免拼写错误等。

对于我的约70张桌子的数据库,它花了我10分钟。创建枚举和我的linq现在是这样的:

var context = ObjectContext.CurrentObjectContext;     var query = from c in context.Group.Include(TableEnum.Category.ToString())     其中c.ProductID == 1     选择c;

同样,不完美,但至少它已被编译器检查