如何在Entity Framework Core中获取指定列及执行自定义查询?
Entity Framework Core 常见问题解决
一、获取指定列数据
你可以通过投影来仅选择需要的列,常用两种实现方式:
1. 匿名类型(适合临时场景)
直接在Select方法中指定要返回的列:
[HttpGet] public async Task<IActionResult> GetAllProducts() { var products = await _fullStackDbContext.Products .Select(p => new { p.Id, p.Name, p.Price // 替换为你实际需要的列名 }) .ToListAsync(); return Ok(products); }
2. 自定义DTO类(适合复用场景)
如果需要在多处复用返回结构,建议定义DTO(数据传输对象):
// 先定义DTO类 public class ProductDto { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } // 接口中使用DTO [HttpGet] public async Task<IActionResult> GetAllProducts() { var products = await _fullStackDbContext.Products .Select(p => new ProductDto { Id = p.Id, Name = p.Name, Price = p.Price }) .ToListAsync(); return Ok(products); }
二、自定义查询相关说明
你之前的代码其实会自动生成SQL查询,EF Core会把LINQ语句翻译成对应的SQL发送到数据库,比如_fullStackDbContext.Products.ToListAsync()会生成SELECT * FROM Products这类查询。
如果需要执行自定义SQL或复杂逻辑,有以下几种方式:
1. 执行原生SQL返回实体
用FromSqlRaw执行原生SQL并返回实体类型:
[HttpGet] public async Task<IActionResult> GetProductsByName(string name) { var products = await _fullStackDbContext.Products .FromSqlRaw("SELECT * FROM Products WHERE Name = {0}", name) .ToListAsync(); return Ok(products); }
2. 执行原生SQL返回自定义类型
EF Core 7及以上版本支持直接返回非实体的自定义类型:
[HttpGet] public async Task<IActionResult> GetProductNames() { var productNames = await _fullStackDbContext.Database .SqlQuery<string>("SELECT Name FROM Products") .ToListAsync(); return Ok(productNames); }
3. 用LINQ构建复杂查询
无需写原生SQL,用LINQ即可实现过滤、排序、分组等复杂逻辑:
[HttpGet] public async Task<IActionResult> GetCheapProducts() { var cheapProducts = await _fullStackDbContext.Products .Where(p => p.Price < 50) .OrderBy(p => p.Price) .Select(p => new { p.Id, p.Name, p.Price }) .ToListAsync(); return Ok(cheapProducts); }
内容的提问来源于stack exchange,提问作者Muhammad Arif
相关产品推荐
相关产品推荐

