我有一个WCF服务,它有一个名为GetLineBusses的简单方法。
public MobileResponse GetLineBusses(MobileRequest Request)
{
MobileResponse response = new MobileResponse();
using (var entities = new NerdeBuOtobusEntities())
{
Line line = null;
List<Point> points = new List<Point>();
City city = entities.Cities.SingleOrDefault(t => t.ID == Request.CityID);
try
{
line = entities.Lines.SingleOrDefault(t => t.ID == Request.LineID);
//if (line != null)
//{
// points = entities.Points.ToList().Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList();
//}
}
catch (System.Exception ex)
{
}
FetcherManager fetcherManager = new FetcherManager(city);
List<Bus> busses = fetcherManager.GetLineBusses(line);
List<BusDTO> busDtos = new List<BusDTO>();
foreach (Bus bus in busses)
{
BusDTO aBus = new BusDTO(bus);
busDtos.Add(aBus);
}
response.Points = points.Select(t => new PointDTO(t)).ToList();
response.Busses = busDtos;
}
return response;
}
我观察到的是,当我发布上述方法时,每个查询方法都会增加我的IIS工作进程ram使用高达160,000 kb。为了找出问题,我注释掉了
City city = entities.Cities.SingleOrDefault(t => t.ID == Request.CityID);
和
line = entities.Lines.SingleOrDefault(t => t.ID == Request.LineID);
现在,方法的ram使用最小化为20,000。我认为问题是因为实体框架尤其是LINQ。顺便说一句,我已经尝试过静态查询以减少内存使用但它根本不起作用。我怎么解决这个问题?我想通过使用LINQ来最小化ram的使用...
此致
末尔
答案 0 :(得分:0)
看起来Entity Framework在每次方法调用时都会从表中加载所有数据。 检查实体框架的版本。 4.0以上的版本以纯粹的性能着称。 还尝试指定一些选择查询以减少数据量。
答案 1 :(得分:0)
以下行是在entities.Points上调用ToList()。这会导致整个Points表被加载到DataContext中,然后应用Where()子句。
points = entities.Points.ToList().Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList();
尝试在entities.Points之后删除ToList()。例如,
points = entities.Points.Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList();