Mar*_*arc 2 c# entity-framework-core asp.net-core
我对实体框架还很陌生,我的表关系看起来有点像这样
public class Customer {
public int Id { get; set; }
public string Name { get; set; }
public List<Product> Products { get; set; }
}
public class Product {
public int Id { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想对 Customer 表进行查询,并且只包含最后创建的 Product MAX(Id)
正常的 SQL 查询看起来像这样
SELECT *
FROM Customer
INNER JOIN Product ON Customer.Id = Product.CustomerId
WHERE Product.Id = (SELECT MAX(Id) FROM Product WHERE CustomerId = Customers.Id)
Run Code Online (Sandbox Code Playgroud)
我当前的 EF 查询看起来像这样,但它返回所有产品...
List<Customer> customers = _context.Customers
.Include(c => c.Products)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我尝试了这样的事情,这给了我正确的结果,但是 EF 进行了一堆查询,很快我发现这似乎是错误的方法
List<Customer> customers = _context.Customers
.Select(c => new Customer() {
Id = c.Id,
Name = c.Name,
c.Products = c.Products.Where(d => d.Id == c.Products.Max(max => max.Id)).ToList()
}).ToList();
Run Code Online (Sandbox Code Playgroud)
我想要一些建议,或者是否有不同的方法可以使此工作有效。
看起来下面的查询可以用不同的方式编写
SELECT *
FROM Customer
INNER JOIN Product ON Customer.Id = Product.CustomerId
WHERE Product.Id = (SELECT MAX(Id) FROM Product WHERE CustomerId = Customers.Id)
Run Code Online (Sandbox Code Playgroud)
这可以写成
SELECT TOP 1 *
FROM Customer
INNER JOIN Product ON Customer.Id = Product.CustomerId
Order by Product.Id desc
Run Code Online (Sandbox Code Playgroud)
假设需要客户名称,上面的查询可以用 LINQ 或使用 EF 编写,如下所示
var customers = _context.Customers.Join(_context.Products, cu => cu.id,
p => p.CustomerId, (cu,p) => new { cu,p})
.Select( c => new { prodId = c.p.Id,customername = c.cu.Name })
.OrderByDescending( c => c.prodId).Take(1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9421 次 |
| 最近记录: |