使用Groupby将代码转换为更快的代码

时间:2019-06-19 13:11:03

标签: c# asp.net-mvc entity-framework linq entity-framework-core

我需要以以下格式返回值:

使用新闻类别来查找新闻,并从每个类别中选择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;
}

我需要编写更快的代码以提高项目的性能。

如何解决此问题?

样本数据:

i,但返回此值

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 个答案:

答案 0 :(得分:2)

我对这些类中的“ Entities”属性返回的值感到怀疑。他们可以轻松地返回所有实体的物化列表,这些实体可以有效地从数据库中执行“ SELECT *”。

首先简化问题。删除所有未知的,抽象的,尤其是异步的,因为从我能阅读的这段代码中,它并没有利用异步。异步是经过验证的同步解决方案,应该解决的问题,不是灵丹妙药或性能修复。

按类别获取最早的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填充视图模型。 (新闻内容等)

示例中的最后一个细节是您是否要排除下面没有至少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();