我正在研究Asp.net Core项目并使用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
领域。我该怎么办?
答案 0 :(得分:2)
您可以尝试下面的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的属性,则可以在Select中映射该模型,如下所示-
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()
});
答案 1 :(得分:2)
您通常会为此定义一个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());
}