我正在尝试使用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的语法(如果这是正确的方法)。
有什么想法?感谢。
答案 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;
同样,不完美,但至少它已被编译器检查