在渲染我的视图之前,是否会急切地将Linq加载到实体查询?

时间:2015-08-08 22:45:45

标签: asp.net-mvc linq entity-framework linq-to-entities

当我的视图被渲染时,我将需要从我的viewmodel获取位置数据(长/纬度坐标数组)。我将使用Javascript读取这些值并在Google Map中绘制它们。目前我正在获取包含位置数据的结果,但我不确定如何有效地从结果中获取位置数据并将它们放入我的视图模型中的另一个属性中。这应该是急切加载,懒惰加载等?我是Linq和EF的新手。

我有一个看起来像这样的视图模型

public class YogaSpaceListViewModel
{
    public IPagedList<YogaSpaceResults> YogaSpaces { get; set; }
    // I need to put all LocationPoints data from the query results into a collection here
    //public some collection here LocationResults { get; set; }
}

FYI IPagedList继承自IEnumerable。

当我获取结果时,这是我的查询。我将结果放入一个匿名类型'YogaSpaceResults',您可以看到它包含我想要存储在我的视图模型中的'LocationPoints'数据。

var events = (from u in context.YogaSpaceEvents
    orderby u.YogaSpace.Address.LocationPoints.Distance(myLocation)
    where
        (u.DateTimeScheduled >= classDate) &&
        (u.YogaSpace.Address.LocationPoints.Distance(myLocation) <= 8047)
            select new YogaSpaceResults 
            {   
                LocationPoints = u.YogaSpace.Address.LocationPoints,
                Title = u.YogaSpace.Overview.Title,
                Summary = u.YogaSpace.Overview.Summary,
                Date = u.DateTimeScheduled
            }).ToPagedList(page, 10);

在我看来我正在做这样的事情

@foreach (var space in Model.YogaSpaces)
    {
        <div>
            <h4>@space.Title</h4>
            <div>
                @space.Summary
                <br/>
                @space.Date
            </div>
        </div>
        <hr />
    }

1 个答案:

答案 0 :(得分:1)

  

我不确定如何有效地从结果中获取位置数据,并将它们放入我的视图模型中的另一个属性中。这应该是急切加载,懒惰加载等吗?

当你执行ToPagedList时,它们已经从db加载了,所以你不需要加载它们,一切都将在内存中完成

你可以拥有像

这样简单的东西
public IEnumerable<LocationPoint> LocationResults {
    get{
        return YogaSpaces.Select(ys => ys.LocationPoints)
    }
}

顺便说一句,您似乎已经以有效的方式从数据库中获取数据(使用单个查询在视图模型中投影所需的属性,这比延迟加载或预先加载更有效)所以你可以轻松保存当前的代码。

请注意,如果您发现查询太慢,则可能缺少此条件的空间索引

(u.YogaSpace.Address.LocationPoints.Distance(myLocation) <= 8047)