C# 在linq中添加带计数函数的额外列以进行查询?

C# 在linq中添加带计数函数的额外列以进行查询?,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我正在从事一个Asp.net核心项目,使用CodeFirst,并有一个sql语法如下的查询 SELECT PartID, PartName, PartLevel, (SELECT COUNT(ID) AS Expr1 FROM dbo.systemparts WHERE(MSys.PartID = PartLevel)) AS ChildCount FROM dbo.systemparts AS MSys 样本输出 我的型号 publ

我正在从事一个Asp.net核心项目,使用CodeFirst,并有一个sql语法如下的查询

  SELECT PartID, PartName, PartLevel,
       (SELECT   COUNT(ID) AS Expr1
       FROM   dbo.systemparts
       WHERE(MSys.PartID = PartLevel)) AS ChildCount
  FROM dbo.systemparts AS MSys
样本输出

我的型号

public class SystemPart
{
    [Key]
    public int PartID { get; set; }

    public string PartName { get; set; }

    public int PartLevel { get; set; }
}
控制器

public class HomeController : Controller
{

    private readonly ApplicationDbContext _context;

    public HomeController(ApplicationDbContext context)
    {
        _context = context;
    }

    public IActionResult Index()
    {
        return View();
    }
}

现在,我想在linq中将其更改为在索引操作中查询字符串或lambda表达式。但是我不能处理
ChildCount
feild。如何操作?

您可以尝试下面的LINQ查询,它将返回
antonymous
类型的集合

context.systemparts.Select(p=> new {
         PartId = p.Partid,
         PartName = p.PartName,
         PartLevel = p.PartLevel,
         ChildCount = context.systemparts.Where(q=>q.PartLevel = p.Partid).Count()
});
如果视图模型包含ChildCount的属性,则可以在选择中映射该模型,如下所示-

context.systemparts.Select(p=> new ViewModelName {
             PartId = p.Partid,
             PartName = p.PartName,
             PartLevel = p.PartLevel,
             ChildCount = context.systemparts.Where(q=>q.PartLevel = p.Partid).Count()
    });

您可以尝试下面的LINQ查询,它将返回antonymous类型的集合

context.systemparts.Select(p=> new {
         PartId = p.Partid,
         PartName = p.PartName,
         PartLevel = p.PartLevel,
         ChildCount = context.systemparts.Where(q=>q.PartLevel = p.Partid).Count()
});
如果视图模型包含ChildCount的属性,则可以在选择中映射该模型,如下所示-

context.systemparts.Select(p=> new ViewModelName {
             PartId = p.Partid,
             PartName = p.PartName,
             PartLevel = p.PartLevel,
             ChildCount = context.systemparts.Where(q=>q.PartLevel = p.Partid).Count()
    });

您通常会为此定义ViewModel,因为您希望将其返回到视图:

public class SystemPartViewModel
{
    public int PartId { get; set; }
    public string PartName { get; set; }
    public int PartLevel { get; set; }
    public int ChildCount { get; set; }
}
然后,您可以使用LINQ非常轻松地执行查询:

public async Task<IActionResult> Index()
{
    var query = 
        from msys in _context.SystemParts
        let childCount = _context.SystemParts.Count(x => x.PartLevel == msys.PartID)
        select new SystemPartViewModel
        {
            PartId = msys.PartID,
            PartName = msys.PartName,
            PartLevel = msys.PartLevel,
            ChildCount = childCount
        };

    return View(await query.ToListAsync());
}
公共异步任务索引()
{
变量查询=
来自msys in_context.SystemParts
let childCount=\u context.SystemParts.Count(x=>x.PartLevel==msys.PartID)
选择新系统零件视图模型
{
PartId=msys.PartId,
PartName=msys.PartName,
PartLevel=msys.PartLevel,
ChildCount=ChildCount
};
返回视图(wait query.ToListAsync());
}

您通常会为此定义ViewModel,因为您希望将其返回到视图:

public class SystemPartViewModel
{
    public int PartId { get; set; }
    public string PartName { get; set; }
    public int PartLevel { get; set; }
    public int ChildCount { get; set; }
}
然后,您可以使用LINQ非常轻松地执行查询:

public async Task<IActionResult> Index()
{
    var query = 
        from msys in _context.SystemParts
        let childCount = _context.SystemParts.Count(x => x.PartLevel == msys.PartID)
        select new SystemPartViewModel
        {
            PartId = msys.PartID,
            PartName = msys.PartName,
            PartLevel = msys.PartLevel,
            ChildCount = childCount
        };

    return View(await query.ToListAsync());
}
公共异步任务索引()
{
变量查询=
来自msys in_context.SystemParts
let childCount=\u context.SystemParts.Count(x=>x.PartLevel==msys.PartID)
选择新系统零件视图模型
{
PartId=msys.PartId,
PartName=msys.PartName,
PartLevel=msys.PartLevel,
ChildCount=ChildCount
};
返回视图(wait query.ToListAsync());
}

@CamiloTerevinto在中添加了更多信息question@CamiloTerevinto在模型中没有
ChildCount
字段的问题中添加了更多信息。如何在模型中传递ChildCount?您需要在模型中添加ChildCount,然后您可以返回
newmodelname{}
,而不是匿名模型
new{}
;在模型中没有
ChildCount
字段。如何在模型中传递ChildCount?您需要在模型中添加ChildCount,然后您可以返回
newmodelname{}
,而不是匿名模型
new{}