我是新手使用LINQ to Entities(或实体框架,无论他们调用它),我写了很多这样的代码:
var item = (from InventoryItem item in db.Inventory
where item.ID == id
select item).First<InventoryItem>();
然后像这样调用该对象上的方法:
var type = item.ItemTypeReference;
或
var orders = item.OrderLineItems.Load();
检索子对象或相关对象。
我没有对数据库进行分析或挖得太深,但我的猜测是,当我调用.Load()或* Reference属性时,我实际上正在再次调用数据库。如果是这种情况,有没有办法在我的初始LINQ表达式中获取这些对象?
答案 0 :(得分:61)
您希望在此"Shaping query results"文章中使用.Include(字符串)方法引用。
var item = from InventoryItem item in
db.Inventory.Include("ItemTypeReference").Include("OrderLineItems")
where item.ID == id
select item;
“包含”可能还有“sql”样式语法。
另请参阅此article关于从LINQ-to-SQL转移到LINQ-to-Entities。
对于其他寻找 Linq to SQL 此问题的解决方案的人,您希望执行以下操作(替换DataContext和其他类型的任何内容):
using (DataContext db = new DataContext())
{
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference);
options.LoadWith<InventoryItem>(ii => ii.OrderLineItems);
db.LoadOptions = options;
var item = from InventoryItem item in db.Inventory
where item.ID == id
select item;
}
每当加载父项(InventoryItem)时,这将加载LoadWith中指定的属性,用于该特定上下文。
在回答James和Jesper的其他一些问题时,请查看question
答案 1 :(得分:0)
除了Robert的回答之外,您可能想查看这个问题以获取扩展方法的选项,该方法允许您使用表达式而不是字符串来使用.Include(),因此您可以获得编译时检查:
答案 2 :(得分:0)
AFAIK, 对于silverlight(域名服务),将[Include]属性添加到正确的位置(在元数据中的导航属性上)就足够了https://stackoverflow.com/a/5332188/413032