Преобразование кодов в более быстрые коды с помощью Groupby - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно вернуть значение в этом формате:

Найти новости по их категории и выбрать из каждой категории 6 новостей

 Category :
          news
          news
          news
          news
          news
          news
 Category :
          news
          news
          news
          news
          news
          news
 Category :
          news
          news
          news
          news
          news
          news

Я написал этот код, но он очень медленный.

private async Task<List<NewsDto>> GetCatNews()
{
    List<NewsDto> news = new List<NewsDto>();
    var FindAllCategory = this.CategoryService.Entities.ToList();
    foreach (var item in FindAllCategory)
    {
        var model = new NewsDto();
        var TakNews = Entities.Where(x => x.CategoryId == item.Id).Take(6)
            .OrderBy(x => x.CreateDate).ToList();
        if (TakNews.Count >= 6)
        {
            news.Add(new NewsDto
            {
                CatId = item.Id,
                CatName = item.Name,
                NewsContents = await AddNewsContents(TakNews)
            });
        }
    }
    return news;
}

public async Task<List<NewsContent>> AddNewsContents(List<Post> TakNews)
{
    List<NewsContent> newsContents = new List<NewsContent>();
    foreach (var addNews in TakNews)
    {
        newsContents.Add(new NewsContent
        {
            Description = addNews.Description,
            Id = addNews.Id,
            ImagePath = rootSiteData.GetNewPath() + '/' + addNews.ImagePath,
            Title = addNews.Title
        });
    }
    return newsContents;
}

Мне нужно написать более быстрый код для повышения производительности в проекте.

Как я могу решить эту проблему?

Пример данных:

я, кроме как вернуть это значение

iexcept вернуть это значение

"data": [
{
  "catId": 1,
  "catName": "سیاسی",
  "newsContents": [
    {
      "id": 3048,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/509246904089447.jpg",
      "title": "نفت در برابر غذا! / حقایق تلخ اینستکس چیست؟ ا",
      "description": "اروپایی‌ها بعد از ۹ ماه تعلل و مذاکره و ۴ ماه پس از اعلام تصمیم‌شان برای مقابله با تحریم‌های ثانویه امریکا یک ساز و کار با ظرفیت محدود آن هم نه برای تبادل پول بلکه برای تامین غذا و دارو ایجاد کرده اند.\n"
    },
    {
      "id": 3049,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/349512794187136.jpg",
      "title": "پاسخ ایران به ادعای آمریکا در رابطه با بروز تنش در منطقه",
      "description": "نمایندگی ایران در سازمان ملل، ادعاها اخیر آمریکا از جمله دستور تخلیه کارمندان غیرضروری این کشور در عراق را آخرین پرده از جنگ تبلیغاتی آمریکا علیه ایران با استفاده از \"گزارش‌های اطلاعاتی تقلبی\"دانست که به منظور بهانه شروع یک درگیری احتمالی بیان می‌شود.\n"
    },
    {
      "id": 3050,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/946066292956619.jpg",
      "title": "به زودی احکام افزایش دستمزد کارمندان ابلاغ می‌شود",
      "description": "تسنیم نوشت: نماینده همدان در مجلس از نشست مشترک دولت، مجلس و دیوان محاسبات برای تعیین تکلیف حقوق و دستمزد کارمندان خبر داد.\n\n"
    },
    {
      "id": 3051,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/322083917213095.jpg",
      "title": "عصبانیت شدید ترامپ از سیاست های بولتون و ترامپ در قبال ایران",
      "description": "روزنامه واشنگتن پست به نقل از چند مقام آمریکایی گزارش داد دونالد ترامپ از مشاوران ارشدی که به نظر وی ایالات متحده را به سوی تقابل با ایران می برند ناراضی و ناامید شده و او به دنبال گفت وگو با ایران است."
    },
    {
      "id": 3052,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/322083917213095.jpg.jpg",
      "title": "اقدامات ایران غرب را پشیمان خواهد کرد",
      "description": "عضو شورای مرکزی حزب موتلفه اسلامی گفت: آمریکایی‌ها در برجام بد عهدی کردند و از آن خارج شدند، لذا مذاکره با آمریکا تعطیل است."
    },
    {
      "id": 3053,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/215729472154856.jpg",
      "title": "ایران در برابر آمریکا باید سیاست تهاجمی به کار گیرد",
      "description": "نایب رییس جبهه پیروان خط امام و رهبری گفت: باید در سالگرد خروج آمریکا از برجام سیاست تهاجمی به کار گیریم و خیلی پذیرفته نیست که در برابر آمریکایی‌ها منفعل باشیم.\n"
    }
  ]
},
{
  "catId": 14,
  "catName": "ورزشی",
  "newsContents": [
    {
      "id": 3042,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/226736856824855.jpeg",
      "title": "همه احتمالات درباره قفس توری ” استقلال ” ؛ وضعیت رحمتی و حسینی چگونه خواهد بود ؟",
      "description": "استقلال در ادوار مختلف دروازه‌بان‌های خوبی داشته و در خیلی سال‌ها کیفیت خوب هر دو دروازه‌بان از نظر فنی به نفع تیم بوده، اما مشکلات زیادی هم درست کرده است.\n\n"
    },
    {
      "id": 3043,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/21463635040650.jpg",
      "title": "پرسپولیس ستاره استقلال را به صورت رسمی جذب کرد",
      "description": "به گزارش گروه ورزشی خبرگزاری برنا؛ با نظر مثبت برانکو، ساسان زمانه، دروازه بان تیم امید استقلال به صورت رسمی به تیم فوتبال پرسپولیس پیوست.\n\n"
    },
    {
      "id": 3044,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/836138365621559.jpg",
      "title": "یک میلیارد به من بدهید استقلال را قهرمان کنم",
      "description": "گلر سابق استقلال نسبت به شرایط کنونی این تیم ناراضی است و از بازیکنان گلایه دارد.\n\n"
    },
    {
      "id": 3045,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/622410699584925.jpg",
      "title": "مهره ثابت برانکو رفتنی شد",
      "description": " فصل نقل‌وانتقالات از همین حالا برای باشگاه پرسپولیس آغاز شده است."
    },
    {
      "id": 3046,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/130684227374618.jpg",
      "title": "سکوی قهرمانی پرسپولیس در حال آماده‌سازی",
      "description": "به گزارش شریان نیوز،پرسپولیس در آستانه قهرمانی لیگ برتر قرار دارد.\n\n"
    },
    {
      "id": 3047,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/149180200034218.jpg",
      "title": "سلطانی‌فر: زیر سؤال بردن همه چیز با یک شکست، عین بی‌انصافی و بی‌عدالتی است",
      "description": "مسعود سلطانی‌فر، وزیر ورزش و جوانان گفت: اینکه هر کسی شکست بخورد و بخواهد همه چیز را زیر سؤال ببرد، عین بی‌انصافی و بی‌عدالتی است.\n"
    }
  ]
},
{
  "catId": 1011,
  "catName": "فناوری",
  "newsContents": [
    {
      "id": 3054,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/458855903672103.jpg",
      "title": "دستیابی به فرمولاسیون بزاق زالو برای ترمیم زخم",
      "description": "محققان کشور درصدد هستند تا فرمولاسیون سرم و کرمی که از بزاق زالوی ایرانی به دست آورده اند را برای ترمیم زخم به کار ببرند.\n\n"
    },
    {
      "id": 3055,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/5412820294475.jpg",
      "title": "آزمایش موفقیت آمیز سپر دفاعی ایرانی برای خنثی کردن «استاکس‌نت»",
      "description": "وزیر ارتباطات و فناوری اطلاعات از موفقیت‌آمیز بودن آزمایش سپر دفاعی (فایروال) برای سیستم‌های اتوماسیون صنعتی که از سوی دانشمندان جوان ایران ساخته شده، خبر داد.\n\n"
    },
    {
      "id": 3056,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/135842434489640.jpg",
      "title": "شرکت های فناوری در برابر محتوای خشونت آمیز اینترنت متعهد شدند",
      "description": "طرح «کریستی چرچ» در اجلاسی با حضور رهبران ۹ کشور و نمایندگان شرکت های فناوری امضا شد. در این سند قانونی شرکت‌های فناوری از جمله فیس بوک، توئیتر، گوگل به اقدامات خاص متعهد شدند.\n\n"
    },
    {
      "id": 3057,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/364654025412296.jpg",
      "title": "عملکرد مناطق ویژه علم و فناوری بازنگری می شود",
      "description": "دبیرکل شورای عالی علوم تحقیقات و فناوری با بیان اینکه عملکرد مناطق ویژه علم و فناوری خوب نبوده گفت: عملکرد این مناطق مورد بازنگری قرار می گیرد.\n\n"
    },
    {
      "id": 3058,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/157874084121194.jpg",
      "title": "تاکسی هوایی آلمانی برای نخستین بار آزمایش شد",
      "description": "نخستین آزمایش تاکسی هوایی متعلق به شرکت آلمانی لیلیوم انجام شد. این تاکسی هوایی الکتریکی ۳۶ موتور دارد و به طور عمودی از زمین بلند می شود و فرود می آید."
    },
    {
      "id": 3059,
      "imagePath": "https://localhost:44372/Uplaod/NewsPictureFolder/NewsMainPicture/236575355911763.jpg",
      "title": "مایکروسافت مجبور به وصله کردن ویندوزهای از رده خارج شد",
      "description": "اگر چه مایکروسافت سالهاست دیگر از ویندوز ایکس پی پشتیبانی نمی‌کند، اما خطرات روزافزون بدافزار واناکرای این شرکت را مجبور به پشتیبانی مجدد از ویندوزهای قدیمی کرده است."
    }
  ]
}

1 Ответ

2 голосов
/ 20 июня 2019

Я подозреваю, что возвращает свойство "Entities" в этих классах.Они могут легко возвращать материализованные списки всех сущностей, которые фактически выполняют «ВЫБОР *» из базы данных.

Начните с упрощения проблемы.Удалите все неизвестные, абстракции и особенно эту асинхронность, потому что из того, что я могу прочитать из этого кода, он не использует асинхронность.Async - это то, что нужно учитывать после того, как решение для синхронизации будет доказано, это не серебряная пуля или исправление производительности.

Чтобы получить самые старые 6 новостных статей по категориям:

using (var context = new NewsDbContext())
{
    var categoriesWithNews = context.News.GroupBy(x => x.Category)
        .Select(x => new
        {
            Category = x.Key,
            News = x.OrderBy(n => n.CreatedDate).Take(6).ToList()
        }).ToList();
}

Если вам нужны 6 последних новостных статей, замените OrderBy на OrderByDescending.

В зависимости от количества категорий, это может привести к значительному объему данных.Если это все еще разумно, мы можем оптимизировать это, чтобы выбрать только те данные, которые нам нужны, а не целые сущности:

var baseImagePath = rootSiteData.GetNewPath() + '/';
using (var context = new NewsDbContext())
{
    var data = context.News.GroupBy(x => x.Category)
        .Select(x => new
        {
            data = new 
            {
                CatId = x.Key.Id, 
                catName = x.Key.Name,
                newsContents = x.OrderBy(n => n.CreatedDate)
                .Select(n => new 
                {
                    id = n.Id,
                    imagePath = baseImagePath + n.ImagePath,
                    title = n.Title,
                    description = n.Description
                 }).Take(6).ToList()
        }).ToList();

    // Serialize data.
}

В приведенном выше примере используются анонимные типы, которых должно быть достаточно, если вы просто хотите сериализовать результаты,В качестве альтернативы вы можете использовать Select для заполнения моделей представлений, если это то, что вы хотите вернуть.(NewsContent и т. Д.)

Последней деталью в вашем примере было то, хотите ли вы исключить какую-либо категорию, в которой нет как минимум 6 новостных элементов.Если это требование, то добавьте предложение Where перед окончательным ToList():

    var data = context.News.GroupBy(x => x.Category)
        .Select(x => new
        {
            data = new 
            {
                CatId = x.Key.Id, 
                catName = x.Key.Name,
                newsContents = x.OrderBy(n => n.CreatedDate)
                .Select(n => new 
                {
                    id = n.Id,
                    imagePath = baseImagePath + n.ImagePath,
                    title = n.Title,
                    description = n.Description
                 }).Take(6).ToList()
        })Where(x => x.newsContents.Count() == 6)
        .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...