Як я магу аптымізаваць гэты ActionResult для лепшай прадукцыйнасці? Мне трэба ставіць паставіць таймер на калі «GET» дадзеныя XML з URL і г.д.

У мяне ёсць ActionResult, што я думаю, што гэта даволі цяжка, таму мне цікава, як я магу аптымізаваць яго, каб ён атрымлівае больш высокую прадукцыйнасць. Гэта вэб-дадатак будзе выкарыстоўвацца на +100 000 карыстальнікаў адначасова.

Цяпер мая ActionResult робіць наступныя рэчы:

  • Атрымаць XML-файл з Інтэрнэту URL
  • Запаўняе дадзеныя xml у мой DB
  • дадзеныя DB запаўняе мой ViewModel
  • Вяртае мадэль з пункту гледжання

Гэты 4 функцыі выклікае кожны раз, калі карыстальнік наведвае меркаванне. Вось чаму я думаю, што гэта ActionResult вельмі дрэнна зроблена мной.

Як я магу дадаць гэта наступныя рэчы свайго Actionresults?

дадаць таймер для здабывання XML-файла і запоўніць дадзеныя xml ў БД, як кожныя 10 хвілін, так што яно не выкліча кожнае наведвання ў карыстацкіх уяўленнях. Адзіная функцыя, якая павінна выклікаць кожны раз, калі наведвання ў карыстацкім сайце з'яўляецца ViewModel абавязковага і вяртанне мадэлі. Як я магу гэта зрабіць?

Note:

  • файл xml абнаўляецца новымі дадзенымі кожныя 10 мін або каля таго.
  • У мяне ёсць каля 50 actionresults, што робіць адны і тыя ж дадзеныя з'явіцеся xml і дадае ў базу дадзеных, але 50 розных файлаў XML.
  • Калі xml URL адсутнічае ён павінен прапусціць ўвесь XML-пошуку і БД дадаваць й навогул modelbinding

Гэта мой ActionResult:

public ActionResult Index()
        {
            //Get data from xml url (This is the code that shuld not run everytime a user visits the view)
            var url = "http://www.interneturl.com/file.xml";
            XNamespace dcM = "http://search.yahoo.com/mrss/";
            var xdoc = XDocument.Load(url);
            var items = xdoc.Descendants("item")
            .Select(item => new
            {
                Title = item.Element("title").Value,
                Description = item.Element("description").Value,
                Link = item.Element("link").Value,
                PubDate = item.Element("pubDate").Value, 
                MyImage = (string)item.Elements(dcM + "thumbnail")
               .Where(i => i.Attribute("width").Value == "144" && i.Attribute("height").Value == "81")
               .Select(i => i.Attribute("url").Value)
               .SingleOrDefault()
            })
            .ToList();

            //Fill my db entities with the xml data(This is the code that shuld not run everytime a user visits the view)
            foreach (var item in items)
            {
                var date = DateTime.Parse(item.PubDate);
                if (!item.Title.Contains(":") && !(date <= DateTime.Now.AddDays(-1)))
                    {
                        News NewsItem = new News();
                        Category Category = new Category();
                        var CategoryID = 2;

                        var WorldCategoryID = re.GetByCategoryID(CategoryID);
                        NewsItem.Category = WorldCategoryID;

                        NewsItem.Description = item.Description;
                        NewsItem.Title = item.Title.Replace("'", "");
                        NewsItem.Image = item.MyImage;

                        NewsItem.Link = item.Link;
                        NewsItem.Date = DateTime.Parse(item.PubDate);
                        re.AddNews(NewsItem);
                        re.save();
                    }
                }


            //All code below this commenting needs to run everytime a user visits the view
            var GetAllItems = re.GetAllWorldNewsByID();

            foreach (var newsitemz in GetAllItems)
            {
                if (newsitemz.Date <= DateTime.Now.AddDays(-1))
                {
                    re.DeleteNews(newsitemz);
                    re.save();
                }

            }

            var model = new ItemViewModel()
            {
               NewsList = new List()
            };

            foreach (var NewsItems in GetAllItems)
            {
                FillProductToModel(model, NewsItems);
            }

            return View(model);
        }

Цяпер кожны раз, калі карыстальнік наведвае прадстаўленне індэкса, ён будзе атрымліваць дадзеныя xml і дадаць яго ў базу дадзеных, так што дрэннае выпраўленне Ive зроблена ў маім рэпазітары наступнага на addNews:

 public void AddNews(News news)
        {
            var exists = db.News.Any(x => x.Title == news.Title);

             if (exists == false)
            {
                db.News.AddObject(news);
            }
            else
            {
                db.News.DeleteObject(news);
            }
        }

Любы выгляд рашэнні і інфармацыя высока цэніцца!

5

7 адказы

Ёсць вельмі шмат рэчаў, якія можна было б зрабіць тут: гэта файл павінен быць xml (вельмі шматслоўны ў параўнанні з JSON)? Ці ёсць у яе быць захавана ў БД кожны раз?

Тым не менш, пры ўмове, што вы павінны рабіць кожны крок у вас ёсць два вузкія:

  1. Чаканне файла xml для загрузкі/сінтаксічны аналіз
  2. Захаванне ўсіх дадзеных xml у базу дадзеных

Ёсць некалькі спосабаў, вы можаце паскорыць гэты працэс:

Настройка інтэрвалу апытання

Калі вы шчаслівыя, не бачачы абнаўлення адразу, то вы можаце зрабіць нешта накшталт гэтага:

  • Check the DB for the last update.
  • If (and only if) the last update is more than 10 mins old:
    • Retrieve xml file from a internet url
    • Fills the xml data to my DB
  • DB data fills my Viewmodel
  • Returns the model to the view

Гэта азначае, што вашыя дадзеныя могуць быць да 10 хвілін састарваюцца, але пераважная большасць запытаў будзе мець толькі для запаўнення мадэлі.

У залежнасці ад таго, як выкарыстоўваецца гэта вы маглі б зрабіць гэта яшчэ прасцей - проста дадайце OutputCache атрыбут:

[OutputCache(Duration=600)]
public ActionResult Index() { ...

Гэта пакажа браўзэр толькі абнаўляецца кожныя 10 хвілін. Вы можаце таксама ўсталяваць Месцазнаходжанне атрыбут, каб зрабіць гэта толькі ў кэш браўзэра або на сэрвэры для ўсіх.

Зрабіць здабывання xml асинхр

Падчас загрузкі ў xml файл ваш код у асноўным толькі чакае URL для загрузкі - выкарыстоўваючы новы асінхроннай ключавое слова ў C# не трэба чакаць тут.

public async Task Index()
{
   //Get data from xml url
    string url = "http://www.interneturl.com/file.xml";
    XNamespace dcM = "http://search.yahoo.com/mrss/";

   //The await keyword tells the C# code to continue until the slow action completes
    var xdoc = await LoadRemoteXmlAsync(url, dcM);

   //This won't fire until LoadRemoteXmlAsync has finished
    var items = xdoc.Descendants("item")

Там вельмі шмат больш, выкарыстоўваючы асінхроннай , чым я магу практычна пакрыць тут, але калі вы на Lastest C# і MVC гэта можа быць дастаткова просты, каб пачаць выкарыстоўваць яго.

Зрабіце толькі адзін DB выклік

Ваш бягучы DB захаваць дзеянне вельмі неаптымальнай:

  • Ваш код пакутуе ад чаго-то звычайна называецца N + 1 праблема .
  • Кожны раз, калі вы дадаеце вы першы праверкі загалоўка і выдаленне запісу. Гэта вельмі павольны спосаб зрабіць абнаўленне і будзе рабіць, калі вельмі цяжка выкарыстоўваць якія-небудзь індэксы, каб аптымізаваць яго.
  • Вы перакручванне праз усе вашыя навінавыя артыкулы кожны раз, і выдаліць усе старыя, адзін за адным. Гэта значна больш павольна, чым адзіны выдаліць з навін дзе ... запыт.

Зыходзячы з гэтага, я хацеў бы паспрабаваць наступныя змены (у грубым парадку, як лёгка яны павінны быць):

  1. Change your AddNews method - if the new data is not newer then don't save any changes for that item.

  2. Change your deletion loop to be a single delete from News where Date <= @yesterday

  3. Look at indexes on the news item title and the date, these appear to be the fields that you're querying most.

  4. Look at replacing your AddNews method with something that does an upsert/merge

  5. Does re.GetByCategoryID hit your DB? If so consider splitting that out and either building it into the update query or populating a dictionary to look it up more quickly.

Увогуле, вы павінны мець (у большасці) 1 аперацыю DB за новы навіны артыкулы і 1 аперацыя DB выдаліць старыя. Вы ў цяперашні час 3 за артыкул менш чым за адзін дзень стары ( re.GetByCategoryID + db.News.Any + db.News.Add | DeleteObject ) іншы 1 ( re.GetAllWorldNewsByID ), а затым яшчэ адзін 1 за артыкул выдаліць ( re.DeleteNews ).

дадаць прафіляванне

You can дадаць прафіляванне to MVC projects that will tell you exactly how long each step is taking and help find how to optimise them using MiniProfiler. It's used on StackOverflow and I've used it a lot myself - it will tell you which steps are slowing you down and which aren't worth micro-optimising.

Калі вы не хочаце выкарыстоўваць, што ёсць інструменты аптымізацыі ў Visual Studio, а таксама трэціх бакоў, як тыя, RedGate Мураўёў .

3
дададзена
@Rohander Гэта залежыць ад таго, якія тэхналогіі вы карыстаецеся для падлучэння да БД і тое, што DB гэта. З назваў метадаў, якія вы тэлефануеце, я думаю, Entity Framework, у гэтым выпадку вы можаце выкарыстоўваць ExecuteStoreCommand выканаць ваш SQL непасрэдна. Я таксама прапаную выкарыстоўваць нешта накшталт MiniProfiler , як гэта дасьць вам таймінгі для кожнага аператара SQL.
дададзена аўтар Keith, крыніца
Дзякуй вялікі тлумачэнне! Як exacly я магу змяніць усе мае Db выклікі да аднаго аднаму? : S
дададзена аўтар Obsivus, крыніца
<�Р> Цяпер мая ActionResult робіць наступныя рэчы:      
      
  • Атрымаць <�моцны> XML-файл з інтэрнэт URL
  •   
  • Запаўняе дадзеныя xml у мой DB
  •   
  • дадзеныя DB запаўняе мой ViewModel
  •   
  • Вяртае мадэль з пункту гледжання
  •   

Ва ўсім, што крокі файл xml з'яўляецца адным з «слабай/павольнай лініі сувязі».

У сваіх прыкладаннях я павінен змяніць серыялізацыі xml з ў Protobuf (для нета) і хуткасць была рэзка змяніцца!

Чытанне, запіс, перадача файла xml зрабіць гэта крокі павольна, асабліва калі вы робіце гэта на кожным выкліку.

Такім чынам, гэта першы пункт, што я змяню, у XML-серыялізацыі з больш хуткім адзін.

0
дададзена

100000+ адначасова якія працуюць карыстальнікаў і запіс у базу дадзеных SQL, я думаю, што будзе цяжка дасягнуць без пераасэнсавання ўсёй інфраструктуры.

Я згодны з Мэтам, што было б лепш, каб аддзяліць піша ў базу дадзеных (ёсць працэс индексатора) ад генерацыі вынікаў для карыстальніка. У такім выпадку вы б 1 пісьменнік і 100000+ чытачоў, і гэта будзе ўсё яшчэ занадта шмат для аднаго асобніка сервера і рэляцыйных баз дадзеных маштабавання цяжка. Гледзячы з гэтага пункту гледжання, я б думаць аб тым, ці не рэляцыйных рашэннях захавальнасць, асабліва таму, што вашыя дадзеныя не выглядае вельмі крытычна.

Падобна на тое, кэшаванне вываду будзе працаваць для вас, як інфармацыя не канкрэтнага карыстальніка, таму пытанне, калі проста кэшаванне вываду будзе дастаткова - можа быць вам патрэбен размеркаваны кэш для гэтага. Каб ведаць, што вам трэба разлічваць - як часта заканчваецца кэш і колькі рэсурсаў вам неабходна згенераваць адказ для выдыханага кэша. Майце на ўвазе, што адзін сервер не зможа абслугоўваць 100000+ адначасова якія працуюць карыстальнікаў, так што вы будзеце мець некалькі перадок асобнікаў, кожны з якіх патрабуе, каб генераваць уласны вынік кэшаваць яго - гэта значыць, дзе размеркаванага кэша будзе ўдар у - серверы маглі б падзяліцца генеруецца вынік.

0
дададзена
Гиедрюс вэб-прыкладанні маюць толькі адну базу дадзеных з двума табліцамі толькі, больш нічога. Гэта вельмі просты вэб-дадатак. Я не бачу, як я магу выкарыстоўваць мноства баз дадзеных для такой невялікай базы дадзеных. Мне сапраўды трэба выкарыстоўваць індэксы, калі яго толькі дзве табліцы?
дададзена аўтар Obsivus, крыніца
@Rohander - калі дадатак вельмі проста, гэта азначае, што гэта павінна быць вельмі проста стварыць нагрузачны тэст :) Мае калегі зрабілі тэст прадукцыйнасці IIS некаторы час таму, быўшы адключаныя ўсе модулі, адзін сервер быў у стане служыць ~ 10000 статычных файлаў (адзін піксель малюнка) у секунду. Там выдатны бясплатны інструмент для нагрузачнага тэставання - loadui.org , таму я заклікаю вас зрабіць простыя тэсты нагрузкі на паглядзець, якую прадукцыйнасць вы можаце атрымаць.
дададзена аўтар Giedrius, крыніца

Перасоўванне вымання дадзеных xml і насельніцтва базы дадзеных да фонавым працэсу. Такім чынам, ваша дзеянне будзе проста выняць дадзеныя з базы дадзеных і вярнуць яго.

Больш канкрэтна,

  1. Стварыце праграму, якая будзе працаваць у фонавым рэжыме (як служба Windows)
  2. У цыкле, атрымаць дадзеныя XML, абнавіць базу дадзеных, а затым чакаць вашага жаданага перыяду затрымкі.

Напрыклад, каб затрымаць, вы можаце выкарыстоўваць наступныя для затрымкі на працягу 1 хвіліны (60 секунд):

System.Threading.Thread.Sleep(60*1000);

Sleep may not be the best method of delaying for your needs, but it will work as a start.

0
дададзена
Звычка праца файл, то таму што xml абнаўляецца кожную хвіліну з новымі дадзенымі XML
дададзена аўтар Obsivus, крыніца
з'яўляецца абавязковым ФОС?
дададзена аўтар Obsivus, крыніца
У мяне будзе каля 50 розных АТРЫМАЦЬ xml і дадаць да БД. Ці будзе працаваць з гэтым approught? Isent кэшаванне добрае рашэнне ў адваротным выпадку?
дададзена аўтар Obsivus, крыніца
Ах да, што будзе працаваць, як я магу выканаць «здабываць кожную хвіліну» функцыянальнасць?
дададзена аўтар Obsivus, крыніца
WCF не патрабуецца.
дададзена аўтар Matt Houser, крыніца
Вы можаце абнавіць столькі даных XML, як вы хочаце выкарыстаць гэты падыход. Як захоўваць дадзеныя да вас. Гэта можа быць база дадзеных, Memcache, ці іншы механізм кэшавання. Справа ў тым, хоць, каб аддзяліць яго ад метаду дзеянні.
дададзена аўтар Matt Houser, крыніца
Я абнавіў свой адказ з некаторымі дэталямі.
дададзена аўтар Matt Houser, крыніца
Чаму гэта не будзе працаваць? Ёсць Админцетр працэс здабывання яго кожную хвіліну, або праз кожныя 30 секунд, або кожныя 5 секунд, але вывесці яго з дзеянні.
дададзена аўтар Matt Houser, крыніца

Адным з спосабаў вырашэння гэтай праблемы з'яўляецца з выхадам ASP.NET кэшаванне.

Кэшаванне вываду дазваляе выконваць вашыя дзеянні адзін раз - генераваная старонка затым кэшуецца, так што дзеянне не выконваецца кожны раз. Вы можаце паказаць дзеянне (або клас) у кэш-памяць, а таксама працягласць, каб захаваць пункт закэшированные. Калі мінае элемент кэша, дзеянне будзе працаваць зноў.

Існуе З #/MVC падручнік на сайце ASP.NET: Павышэнне прадукцыйнасці з дапамогай кэшавання выводзяцца дадзеных .

Я б парэкамендаваў вам прачытаць гэтую спасылку, але вось некаторыя важныя дэталі:

<�Р> Уявіце, напрыклад, што ваша прыкладанне ASP.NET MVC выводзіць спіс запісаў базы дадзеных у імпрэзы пад назвай Index. Як правіла, кожны раз, калі карыстальнік актывізуе дзеянне кантролера, які вяртае прадстаўленне Index, набор запісаў базы дадзеных павінны быць выняты з базы дадзеных, выканаўшы зварот у базу. </Р>      <�Р> Калі, з другога боку, вы скарыстацца кэша вываду, то вы можаце пазбегнуць выканання звароту ў базу даных кожны раз, калі любы карыстальнік выклікае такое ж дзеянне кантролера. Прадстаўленне можа быць вынята з кэша замест таго, каб рэгенераваць з дзеяння кантролера. Кэшаванне дазваляе пазбегнуць выканання лішняй працы на сэрвэры.      <�Р> Уключыць кэшаванне вываду шляхам дадання [OutputCache] прыпісаць альбо індывідуальнае дзеянне кантролера або ўвесь клас кантролера. </Р>

Edit - У якасці прыкладу, гэта будзе кэшаваць ActionResult за 1 гадзіну:

[OutputCache(Duration = 3600, VaryByParam = "none")]
public ActionResult Index()
{
...
0
дададзена
Крута так вось і ўсё, што патрабуецца? Ён будзе працаваць ActionResult кожны 1 гадзіну Калі я дадаю OutputCache?
дададзена аўтар Obsivus, крыніца
Што ты маеш на ўвазе? Я паспрабаваў гэта, і гэта, здаецца, працуе, ActionResult здаецца, каб выклікаць адзін раз у 1 гадзіну. Я нахіляюць яго адладкі або што-небудзь, так што здаецца, працуе ??
дададзена аўтар Obsivus, крыніца
Я па-ранейшаму неабходна выкарыстоўваць маю мадэль асобы з кучай асобаў яшчэ
дададзена аўтар Obsivus, крыніца
Гэта здаецца добрым рашэннем маглі б вы даць мне прыклад таго, як гэта можа выглядаць з маёй ActionResult?
дададзена аўтар Obsivus, крыніца
@Obsivus - глядзіце маё рэдагаванне для прыкладу выкарыстання.
дададзена аўтар chue x, крыніца
@Obsivus - гэта не будзе аўтаматычна запускацца. Першы запыт да дзеяння па заканчэнні кэша будзе выконвацца дзеянне.
дададзена аўтар chue x, крыніца
@Rohander - Множныя асобы (або імёны, па меншай меры)! Каб адказаць на ваша пытанне, кэш будзе толькі абнаўляцца, калі карыстальнік трапляе на старонку. Іншымі словамі, IIS сам па сабе не абнаўляе кэш (гэта толькі робіць гэта, калі карыстальнік трапіў на старонку). Гэта ўсё, што я меў на ўвазе.
дададзена аўтар chue x, крыніца

Вы можаце рэалізаваць клас для кіравання выкананнем вашай апрацоўкі xml і БД аперацый на абраным часовым інтэрвале. Я б не выкарыстоўваць таймеры, так як я не думаю, што гэта неабходна: калі ў вас ёсць за 100 000 запытаў рашэнняў, вы можаце проста праверыць, калі вам трэба выканаць вашыя функцыі кожны запыт.

Вось клас, які вы можаце выкарыстоўваць:

public static class DelayedAction
{
    private static Dictionary> _actions;

    static DelayedAction()
    {
        _actions = new Dictionary>();
    }

    public static void Add(Action a, TimeSpan executionInterval)
    {
        lock (_actions)
        {
            _actions.Add(a, new Tuple(DateTime.MinValue, executionInterval));
        }
    }

    public static void ExecuteIfNeeded(Action a)
    {
        lock (_actions)
        {
            Tuple t = _actions[a];
            if (DateTime.Now - t.Item1 > t.Item2)
            {
                _actions[a] = new Tuple(DateTime.Now, t.Item2);
                a();
            }
        }
    }
}

Гэта струменева, і вы можаце дадаць столькі, колькі адтэрмінаваных дзеянні, як вы хочаце.

Каб выкарыстоўваць яго, проста навядзіце курсор здабывання xml і захаваць код функцыі, давайце назавем яго updateNews:

private void updateNews()
{
       //Get data from xml url (This is the code that shuld not run everytime a user visits the view)
        var url = "http://www.interneturl.com/file.xml";
        XNamespace dcM = "http://search.yahoo.com/mrss/";
        var xdoc = XDocument.Load(url);
        var items = xdoc.Descendants("item")
        .Select(item => new
        {
            Title = item.Element("title").Value,
            Description = item.Element("description").Value,
            Link = item.Element("link").Value,
            PubDate = item.Element("pubDate").Value, 
            MyImage = (string)item.Elements(dcM + "thumbnail")
           .Where(i => i.Attribute("width").Value == "144" && i.Attribute("height").Value == "81")
           .Select(i => i.Attribute("url").Value)
           .SingleOrDefault()
        })
        .ToList();

        //Fill my db entities with the xml data(This is the code that shuld not run everytime a user visits the view)
        foreach (var item in items)
        {
            var date = DateTime.Parse(item.PubDate);
            if (!item.Title.Contains(":") && !(date <= DateTime.Now.AddDays(-1)))
                {
                    News NewsItem = new News();
                    Category Category = new Category();
                    var CategoryID = 2;

                    var WorldCategoryID = re.GetByCategoryID(CategoryID);
                    NewsItem.Category = WorldCategoryID;

                    NewsItem.Description = item.Description;
                    NewsItem.Title = item.Title.Replace("'", "");
                    NewsItem.Image = item.MyImage;

                    NewsItem.Link = item.Link;
                    NewsItem.Date = DateTime.Parse(item.PubDate);
                    re.AddNews(NewsItem);
                    re.save();
                }
            }
}

Затым дадаць статычны канструктар да кантролер:

static MyController()
{
    DelayedAction.Add(updateNews, new TimeSpan(0, 10, 0));//set interval to 10mn
}

а затым у вашым Індэкс метад:

public ActionResult Index()
{
    DelayedAction.ExecuteIfNeeded(updateNews);

    //All code below this commenting needs to run everytime a user visits the view
    ....
}

Такім чынам, кожны раз, калі вы атрымліваеце запыт на гэтай старонцы, вы можаце праверыць, калі вам трэба абнавіць дадзеныя. І вы можаце выкарыстоўваць, што для любой іншай апрацоўкі, якая павінна быць затрыманая.

Гэта можа быць добрым дадаткам да кэшаванню.

0
дададзена
Дзякуй вялікі тлумачэнне! :)
дададзена аўтар Obsivus, крыніца
Дзякуй за вялікі адказ. Якая рэальная адрозніваецца ад кэша вываду, і гэты спосаб зрабіць гэта?
дададзена аўтар Obsivus, крыніца
Калі ласка:). Розніца заключаецца ў тым, што кэш вываду з'яўляецца больш «глабальным» метадам. Ён будзе кэшаваць ўвесь вынік вашага метаду. Так што калі ў вас ёсць нейкія іншыя, чым навіны дынамічных элементаў, яны таксама будуць кэшуюцца і застаюцца нязменнымі. З дапамогай метаду я прапанаваў вам мець кантроль над больш тонкай. Таму ў залежнасці ад сітуацыі, вы можаце выкарыстоўваць адзін ці іншы (і так як вы сказалі, што 50 спосабаў, як гэта, можа быць сітуацыі, калі кэшаванне ў цэлым вынік не будзе дастаткова).
дададзена аўтар ppetrov, крыніца
таксама кэш вываду працуе на ўзроўні каркаса і гэта кэш. Апісаны вышэй метад не кэш, гэта свайго роду гнездавой планавальніка. Вы нават можаце кантраляваць яго ў той час як ваш сайт працуе, калі вы зробіце нейкія карэкціроўкі, вы можаце прымусова абнавіць, змяніць інтэрвал выканання ... Гэта ўсё пра тое, колькі кантролю вы хочаце мець з гэтай нагоды. Абодва кэша вываду, і гэты метад можа вырашыць гэтую праблему, гэта ўсё аб выбары;)
дададзена аўтар ppetrov, крыніца

Перш за ўсё вы should't выдаленне навін падчас выканання. Вы можаце зрабіць гэта ўручную або з дапамогай ГРАФІК і замест

var GetAllItems = re.GetAllWorldNewsByID();
foreach (var newsitemz in GetAllItems)
{
    if (newsitemz.Date <= DateTime.Now.AddDays(-1))
    {
        re.DeleteNews(newsitemz);
        re.save();
    }
}

выкарыстоўвайце код:

var GetAllItems = re.GetAllWorldNewsByID().Where(x=>x.Date > DateTime.Now.AddDays(-1)).ToList();

GetAllWorldNewsByID() павінен вяртаць IQuaryable, таму што калі вы вяртаеце спіс, вы губляеце перавагі deffered выканання ( Якія перавагі адкладзенага выканання ў LINQ? ). Калі вы не выдаліце ​​падчас выканання, вы havn't вялікі затрымкі для працы службы (таму, што аперацыі не для карыстальнікаў, але і для ачысткі базы дадзеных)

На другім, вы можаце выкарыстоўваць кэшаванне

//Get data from xml url (This is the code that shuld not run everytime a user visits the view)
var url = "http://www.interneturl.com/file.xml";
// Get data from cache (if available)
List GetAllItems = (List)HttpContext.Current.Cache.Get(/*unique identity of you xml, such as url*/ url);
if (GetAllItems == null)
{
    var xdoc = XDocument.Load(url);
    items = xdoc.Descendants("item").Select(item => new
        {
            Title = item.Element("title").Value,
            Description = item.Element("description").Value,
            Link = item.Element("link").Value,
            PubDate = item.Element("pubDate").Value, 
            MyImage = (string)item.Elements(dcM + "thumbnail")
           .Where(i => i.Attribute("width").Value == "144" && i.Attribute("height").Value == "81")
           .Select(i => i.Attribute("url").Value)
           .SingleOrDefault()
        })
        .ToList();

   //Fill db

    GetAllItems = re.GetAllWorldNewsByID().Where(x=>x.Date > DateTime.Now.AddDays(-1)).ToList()

   //put data into the cache
    HttpContext.Current.Cache.Add(/*unique identity of you xml, such as url*/url, /*data*/ GetAllItems, null,
        DateTime.Now.AddMinutes(1) /*time of cache actual*/,
        System.Web.Caching.Cache.NoSlidingExpiration,
        System.Web.Caching.CacheItemPriority.Default, null);
}
0
дададзена