我有2个对象 - 订单和产品。在订单上,只有productID被保存,当我查看订单时,我想查看产品名称。根据ScuttGu的博客,这很容易通过使用带有Eval的模板字段(“Product.ProductName”)来完成。但是,在查看实际查询时,我发现每个订单都有一个单独的查询。外键导致更多的查询?
它不适合我,因为对于许多行和/或外键许多额外的查询将被做出。它不会使整体效率太低(即linq为什么不使用连接)?
感谢
我有2个对象 - 订单和产品。在订单上,只有productID被保存,当我查看订单时,我想查看产品名称。根据ScuttGu的博客,这很容易通过使用带有Eval的模板字段(“Product.ProductName”)来完成。但是,在查看实际查询时,我发现每个订单都有一个单独的查询。外键导致更多的查询?
它不适合我,因为对于许多行和/或外键许多额外的查询将被做出。它不会使整体效率太低(即linq为什么不使用连接)?
感谢
这是因为在那个评估和演示了运行点,查询已经拥有,不说加入。
当你取你可以使用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;
那是因为你的产品是懒惰加载 - 也就是在需要的时候,他们被加载。
可以DataLoadOptions设置你的fetchingstrategy,并与您的订单加载产品:
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。 loadoptions的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,这与我的信息库和规范模式工作地非常好。