MVC更多指定模型应该更精确的查询填充?

时间:2010-03-27 10:18:54

标签: asp.net-mvc performance linq-to-sql

如果您的carDetail页面有一个具有20个左右属性(和几个表连接)的Car模型,那么您的LINQ to SQL查询将非常大。

如果您有一个使用5个属性的carListing页面(全部来自1个表),那么您使用CarSummary模型。是否应使用与Car模型相同的查询填充CarSummary模型?

或者您应该使用单独的LINQ to SQL查询哪个更精确?

我只是考虑性能,但LINQ使用延迟加载,所以我想知道这是否是一个问题。

3 个答案:

答案 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个字段。