You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Angular13+ASP.NET Core6+SQL Server统计各语言用户数问题

解决方案

1. SQL Server 层面实现(最优方案)

直接通过一次关联查询统计每种语言的订阅用户数,彻底避免多次查询的性能问题:

SELECT 
    l.Id,
    l.Name,
    l.Description,
    COUNT(u.Id) AS SubscriberCount
FROM Languages l
LEFT JOIN Users u ON l.Id = u.LanguageId
GROUP BY l.Id, l.Name, l.Description
ORDER BY l.Name

说明:用LEFT JOIN确保没有订阅用户的语言也会被返回(此时SubscriberCount为0);GROUP BY按语言唯一标识分组统计。

2. ASP.NET Core 6 后端处理

步骤1:创建数据传输对象(DTO)

public class LanguageWithSubscriberDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int SubscriberCount { get; set; }
}

步骤2:用EF Core实现查询逻辑

public async Task<List<LanguageWithSubscriberDto>> GetLanguagesWithSubscriberCounts()
{
    return await _context.Languages
        .GroupJoin(
            _context.Users,
            lang => lang.Id,
            user => user.LanguageId,
            (lang, users) => new LanguageWithSubscriberDto
            {
                Id = lang.Id,
                Name = lang.Name,
                Description = lang.Description,
                SubscriberCount = users.Count()
            })
        .OrderBy(lang => lang.Name)
        .ToListAsync();
}

步骤3:暴露API接口

[HttpGet("with-subscribers")]
public async Task<IActionResult> GetLanguagesWithSubscribers()
{
    var result = await _languageService.GetLanguagesWithSubscriberCounts();
    return Ok(result);
}

后端一次性返回所有语言及对应订阅数,解决二次循环查询无效的问题。

3. Angular 13 前端渲染

步骤1:定义前端接口

export interface LanguageWithSubscriber {
  id: number;
  name: string;
  description: string;
  subscriberCount: number;
}

步骤2:组件中获取数据

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { LanguageWithSubscriber } from './models/language.model';

@Component({
  selector: 'app-language-list',
  templateUrl: './language-list.component.html'
})
export class LanguageListComponent implements OnInit {
  languages: LanguageWithSubscriber[] = [];

  constructor(private http: HttpClient) {}

  ngOnInit(): void {
    this.http.get<LanguageWithSubscriber[]>('/api/languages/with-subscribers')
      .subscribe(data => {
        this.languages = data;
      });
  }
}

步骤3:模板渲染(无无限循环)

<ul>
  <li *ngFor="let lang of languages">
    {{ lang.name }} - 订阅人数: {{ lang.subscriberCount }}
    <p>{{ lang.description }}</p>
  </li>
</ul>

直接用预加载的列表渲染,避免在*ngFor中调用服务,从根源解决无限循环崩溃问题。


内容的提问来源于stack exchange,提问作者Mohamed Sami Khiari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:36:25