如果您的carDetail页面有一个具有20个左右属性(和几个表连接)的Car模型,那么您的LINQ to SQL查询将非常大。
如果您有一个使用5个属性的carListing页面(全部来自1个表),那么您使用CarSummary模型。是否应使用与Car模型相同的查询填充CarSummary模型?
或者您应该使用单独的LINQ to SQL查询哪个更精确?
我只是考虑性能,但LINQ使用延迟加载,所以我想知道这是否是一个问题。
答案 0 :(得分:2)
创建视图模型以表示您需要的不同投影,然后使用选择投影,如下所示。
from c in Cars
select new CarSummary
{
Registration = c.Registration,
...
}
这将创建一个仅选择所需属性的查询。
如果它们在数据上下文关系图(dbml)中表示,
关系将得到解决
select new CarSummary
{
OwnerName = c.Owner.FirstName
}
您也可以在投影中嵌套对象
select new CarSummary
{
...
Owner = new OwnerSummary
{
OwnerName = c.Owner.FirstName,
OwnerAge = c.Owner.Age
}
...
}
如果您在许多地方使用相同的投影,那么编写如下方法会有所帮助,以便投影在一个地方发生。
public IQueryable<CarSummary> CreateCarSummary(IQueryable<Car> cars)
{
return from c in cars
select new CarSummary
{
...
}
}
如果需要,可以这样使用
public IQueryable<CarSummary> GetNewCars()
{
var cars = from c in Cars
select c;
return CreateCarSummary(cars);
}
答案 1 :(得分:0)
我认为在你的情况下,延迟加载并没有带来太多好处,因为你要使用每个表中的1个属性,所以迟早要渲染页面,你将不得不执行所有连接。在我看来,您可以使用相同的查询并从Car模型转换为CarSummary模型。
答案 2 :(得分:0)
如果性能实际上是当前的问题或问题,则应该执行单独的投影linq查询,以便sql查询仅选择填充视图模型所需的5个字段,而不是返回所有20个字段。