【问题标题】:Convert codes to faster codes using Groupby使用 Groupby 将代码转换为更快的代码
【发布时间】:2019-11-02 05:47:51
【问题描述】:

我需要以这种格式返回值:

使用他们的类别查找新闻并从每个类别中选择 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": "اگر چه مایکروسافت سالهاست دیگر از ویندوز ایکس پی پشتیبانی نمی‌کند، اما خطرات روزافزون بدافزار واناکرای این شرکت را مجبور به پشتیبانی مجدد از ویندوزهای قدیمی کرده است."
    }
  ]
}

【问题讨论】:

  • 请您澄清一下您后面的尝试“不工作”是什么意思?它不编译吗?它会抛出异常吗?它不返回您想要的值吗?它有什么作用?
  • @JonSkeet 忽略这部分问题。我想你可以帮助我
  • @mr-dortaj 哪部分代码慢?我认为没有人可以帮助您加快数据库查询本身的速度。您是否正在使用 async/await(它是带有 GUI 的应用程序吗?)
  • 如果您能提供更多有关架构的详细信息,以及一些示例数据和预期输出,这对我们真的很有帮助。目前,我们必须自己做很多猜测。 (我也强烈建议您开始遵循 .NET 命名约定,例如 camelCase 用于参数和局部变量。)为什么 AddNewsContents 在不需要等待任何东西时是异步的?你没有收到警告吗?
  • 有一点需要澄清:每个项目都属于一个类别吗?所有类别都在CategoryService.Entities 内吗?如果是这样,您将通过多个查询获取 all 实体。您可以一次性获取它们并在本地进行分组,这至少会使其更快。使用var grouped = Entities.GroupBy(e =&gt; e.CategoryId) 将在数据库中进行分组。

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


【解决方案1】:

我怀疑这些类中的“实体”属性返回什么。他们可以很容易地返回从数据库中有效地执行“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 个新闻项目的任何类别。如果这是一个要求,那么在最后的ToList() 之前添加一个Where 子句:

    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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2012-04-25
    • 2018-11-05
    • 2013-10-24
    相关资源
    最近更新 更多