我有2个对象 - 订单和产品。在订单上只保存productID,当我查看订单时,我想查看产品名称。根据ScuttGu博客,通过使用带有Eval的模板字段(“Product.ProductName”)可以轻松完成此操作。但是,在查看实际查询时,我看到每个订单都会进行单独的查询。
这对我来说并不合适,因为对于许多行和/或外键,将会进行许多其他查询。难道它不会使整体效率太低(即为什么linq不使用连接)?
由于
答案 0 :(得分:1)
这是因为您的产品是延迟加载的 - 即在需要时加载它们。
您可以使用DataLoadOptions设置您的抓取策略,并使用您的订单加载产品:
MyDataContext db = new MyDataContext();
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Order>(order => order.Product);
db.LoadOptions = options;
var orders = from c in db.Orders
如果你不喜欢pr。 loadacontions的datacontext规范你做这样的事情(不是testet):
MyDataContext db = new MyDataContext();
db.Orders
.Select(o => new { Order = o, Products = o.Products})
.ToList()
.Select(x => x.Order)
.ToList();
我已经实现了this guys fethingstrategies之类的东西,它可以很好地处理我的存储库和规范模式。
答案 1 :(得分:0)
这是因为在Eval运行时,查询已经存在,没有所说的连接。
当您提取查询时,可以使用DataLoadOptions使用.LoadWith()
method来包含此内容:
var dlo = new DataLoadOptions();
dlo.LoadWith<Order>(o => o.Product);
var dc = new DataContext();
dc.LoadOptions = dlo;
var orders = from dc.Orders select o;