2

我正在尝试使用 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 的语法(如果这是正确的方法)。

有什么想法吗?谢谢。

4

2 回答 2

0

首先,我怀疑你同时使用L2SQL和 EF,所以尽量不要混淆人们。

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

1 - 急切加载

q.Include("NavPropertyName")

2 - 显式负载

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

区别在于选项 2) 导致 2 个查询,选项 1 导致 FK 上的内部连接。

我可以同情您因为“魔术字符串”而不愿使用 Include - 我不确定 EF 团队为什么没有将它们强类型化,但我确信有充分的理由。

在此处加载/包含的更多信息。

高温高压

于 2010-10-04T21:19:08.467 回答
0

我想我们都讨厌在 .include() 语句中使用键入的字符串。

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

对于我的大约 70 个表的数据库,我花了 10 分钟。创建枚举,我的 linq 现在是这样的:

var context = ObjectContext.CurrentObjectContext; var query = from c in context.Group.Include(TableEnum.Category.ToString()) where c.ProductID == 1 select c;

同样,并不完美,但至少它由编译器检查

于 2010-10-05T07:49:25.557 回答