【发布时间】:2012-04-12 04:15:36
【问题描述】:
我正在尝试用我的应用做一些聪明的事情。我有一张表,广告 - 其中包含汽车信息:型号、里程等。该表通过外键与其他一些表相关,例如通过链接到“VehicleModels”表等的外键检索模型名称。
在应用程序的“实体”目录(映射到数据库中表的类)中,我有一个用于 Adverts 表的 Advert.cs。这有几个 EF 被告知忽略的属性(在 fluent api 中),因为它们没有映射到 Adverts 表中的实际字段。
这些字段背后的想法是将计算出的与用户输入的邮政编码(邮政编码)的距离存储在搜索表单中,如果他们只想查看特定半径内的可用汽车,则该搜索表单会过滤广告表。例如:
IQueryable<Advert> FilteredAdverts = repository.Adverts
.Where(am => mfr == "" || am.Manufacturer == mfr) &&
(am => model == etc etc...)
稍后,计算代码的相似距离:
if (userPostcode != null) {
foreach (var ap in FilteredAdverts.ToList()) {
distmiles = //calculate distance in miles
distkm = //calculate distance in km
ap.DistanceMiles = Convert.ToInt32(distmiles);
ap.DistanceKm = Convert.ToInt32(distkm);
}
}
我遇到的问题是,为了将值分配给这两个字段,我必须使用 .ToList() 从表中提取所有行。如果只有几行可以正常工作,但是当有 ~1,000 行时,它需要大约。 2.2 秒,当我将其增加到大约 12,000 行时,当没有应用过滤器(即返回所有活动广告)时,页面加载需要 32 秒。
我在调用 .Skip 和 .Take 之前拉出所有广告以显示它们的原因是,搜索表单中可用的过滤器基于所有当前活动广告的可能选项,即剩余时间,而不仅仅是从制造商表中选择制造商列表(用户可以选择没有搜索结果的制造商)。例如
VehicleManufacturers = (from vm in FilteredAdverts.Select(x => x.VehicleManufacturer).Distinct().OrderBy(x => x)
select new SearchOptionsModel
{
Value = vm,
Text = vm,
Count = FilteredAdvertsVM.Where(x => x.VehicleManufacturer == vm).Count(),
})
.... filters for model, mileage etc
要了解我想要实现的目标 - 请查看 Autotrader 网站上的搜索表单。
一旦应用了所有过滤器,就在将模型传递给视图之前,应用了 .Skip 和 .Take,但当然此时所有行都已被拉出。
我的问题是,我该如何重做这个?有没有更好的方法在我的 Advert 实体类中使用这些非映射属性?我在我的家用电脑上工作 - C2D @ 3.4GHz,2GB 内存 - 慢速查询可以在财产网络主机上运行吗?
【问题讨论】:
标签: asp.net-mvc-3 sql-server-2008 entity-framework-4.1