Использование личной памяти WCF увеличивает запрос за запросом - PullRequest
3 голосов
/ 15 сентября 2011

Я получил службу 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 до 160 000кб.Чтобы выяснить проблему, я прокомментировал

City city = entities.Cities.SingleOrDefault(t => t.ID == Request.CityID);

и

line = entities.Lines.SingleOrDefault(t => t.ID == Request.LineID);

Теперь, когда использование оперативной памяти для метода сведено к 20000.Я думаю, что проблема из-за структуры сущностей, особенно LINQ.Кстати, я пробовал статические запросы, чтобы уменьшить использование памяти, однако это не сработало вообще.Как я могу решить эту проблему?Я хочу свести к минимуму использование оперативной памяти с помощью LINQ ...

С уважением

Kemal

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

В следующей строке вызывается ToList () для entity.Points. Это приводит к тому, что вся таблица Points загружается в DataContext, а затем применяется условие Where ().

points = entities.Points.ToList().Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList(); 

Попробуйте удалить ToList () после entity.Points. Например,

points = entities.Points.Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList(); 
0 голосов
/ 15 сентября 2011

Похоже, Entity Framework загружает все данные из таблиц при каждом вызове метода. Проверьте версию Entity Framework. Версии старше 4.0 известны по чистой производительности. Также попробуйте указать какой-либо запрос на выборку, чтобы уменьшить объем данных.

...