外键会导致更多查询?

时间:2010-03-06 16:11:22

标签: linq-to-sql

我有2个对象 - 订单和产品。在订单上只保存productID,当我查看订单时,我想查看产品名称。根据ScuttGu博客,通过使用带有Eval的模板字段(“Product.ProductName”)可以轻松完成此操作。但是,在查看实际查询时,我看到每个订单都会进行单独的查询。

这对我来说并不合适,因为对于许多行和/或外键,将会进行许多其他查询。难道它不会使整体效率太低(即为什么linq不使用连接)?

由于

2 个答案:

答案 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;