Asp.net mvc MVC更多指定的模型也应该由更精确的查询填充?

Asp.net mvc MVC更多指定的模型也应该由更精确的查询填充?,asp.net-mvc,performance,linq-to-sql,Asp.net Mvc,Performance,Linq To Sql,如果您有一个carDetail页面具有20个左右属性(和几个表联接)的汽车模型,那么您的LINQ到SQL查询将非常大 如果您有一个carListing页面,该页面使用了5个以下的属性(全部来自1个表),那么您将使用CarSummary模型。是否应使用与汽车模型相同的查询填充汽车摘要模型 或者应该使用更精确的单独LINQ到SQL查询 我只是在考虑性能,但LINQ使用延迟加载,所以我想知道这是否是一个问题。我认为在您的情况下,延迟加载不会带来太多好处,因为您将使用每个表中的1个属性,所以迟早要呈现页

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

如果您有一个carListing页面,该页面使用了5个以下的属性(全部来自1个表),那么您将使用CarSummary模型。是否应使用与汽车模型相同的查询填充汽车摘要模型

或者应该使用更精确的单独LINQ到SQL查询


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

我认为在您的情况下,延迟加载不会带来太多好处,因为您将使用每个表中的1个属性,所以迟早要呈现页面,您必须执行所有连接。在我看来,您可以使用相同的查询并将汽车模型转换为汽车摘要模型。

如果性能实际上是一个问题或当前的一个问题,您应该执行单独的投影linq查询,以便sql查询仅选择填充视图模型所需的5个字段,而不是返回所有20个字段。

创建视图模型以表示所需的不同投影,然后使用如下选择投影

from c in Cars
select new CarSummary
{
    Registration = c.Registration,
    ...
}
这将创建一个只选择所需属性的查询

如果关系在数据上下文关系图(dbml)中表示,则它们将被解析

也可以将对象嵌套在投影内

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
           {
               ...
           }
}
公共IQueryable CreateCarSummary(IQueryable汽车)
{
从c乘汽车返回
选择新的CarSummary
{
...
}
}
在需要时,可以这样使用

public IQueryable<CarSummary> GetNewCars()
{
     var cars = from c in Cars
                select c;

     return CreateCarSummary(cars);

}
public IQueryable GetNewCars()
{
var cars=来自cars中的c
选择c;
退货汇总表(cars);
}
public IQueryable<CarSummary> GetNewCars()
{
     var cars = from c in Cars
                select c;

     return CreateCarSummary(cars);

}