对象上的IQueryable集合延迟属性设置

时间:2012-06-22 16:10:26

标签: c# linq linq-to-sql collections iqueryable

我有以下代码:

var carsContext = new CarsDataContext();

IQueryable<Car> allCars = carsContext.Cars;

foreach (var car in allCars) 
    Console.WriteLine(car.Color);

我想要的是每个汽车对象都要知道用于检索它的原始datacontext,以便我可以使用如下的辅助方法来装饰它:

foreach (var car in allCars)
    Console.WriteLine(car.GetOwner().Lastname);

使用GetOwner()方法能够自动重用下一个数据库的原始datacontext,而现在我必须做一些丑陋才能获得同样的效果:

foreach (var car in allCars)
{
    car.SetDataContext(carsContext);
    Console.WriteLine(car.GetOwner().Lastname);
}

这些信息是否已经可用于对象,或者我是否应该尝试制作一个自定义的IQueryable实现,当从集合中检索对象时,该实现会自动为我分配这些信息?

我正在尝试这样做,因为出于性能原因,我希望保留针对数据库的表达式的延迟评估作为SQL(我有大型数据集)。

感谢任何建议,谢谢。

编辑:这是简化的示例,例如,对原始数据上下文的引用不一定立即可用。

1 个答案:

答案 0 :(得分:2)

你在使用EF吗?您最初获得汽车实体时可以执行.Include(c =&gt; c.Owner)。延迟加载已保留,但现在您将获得所有者实体以及Car。此外,它可以提高性能,因为您正在进行1次连接查询,而不是为每个汽车实例返回数据库100次。