نروح في الـ Controller بتاعنا وهنعمل Endpoint جديدة بترجع كل الـ Orders لـ User معين

[HttpGet] // GET : /api/Orders?email=mahmoudfeshar11@gmail.com
public async Task<ActionResult<IReadOnlyList<Order>>> GetOrdersForUser(string email)
{
	var orders = await _orderService.GetOrdersForUserAsync(email);
	return Ok(orders);
}

ونروح نعمل implementation للـ Method اللي اسمها GetOrdersForUserAsync جوا Class الـ OrderService

public Task<IReadOnlyList<Order>> GetOrdersForUserAsync(string buyerEmail)
{
	var ordersRepo = _unitOfWork.Repository<Order>();
	// var spec = new OrderSpecifications();
	var orders = await ordersRepo.GetAllWithSpecAsync(spec);
}

محتاج دلوقتي أعمل الـ Specifications للـ Order اللي هتورث من الـ Base هنروح على بروجكت الـ Core وفيه فولدر الـ Specifications فهنعمل فولدر Order Specs ونعمل كلاس جديد نسميه OrderSpecifications محتاجين نظبط الـ Criteria انه يبقا زي الايميل اللي هياخده وبعدها محتاجين نظبط الـ Includes للـ Navigational Properties فهنلاقي الـ Delivery Method بس وافتكر ان الـ Address مش Navigational Property وكمان نرتبها دايما من الجديد للقديم

public class OrderSpecifications : BaseSpecifications<Order>
{
	public OrderSpecifications(string buyerEmail)
		:base(O => O.BuyerEmail == buyerEmail)
	{
		Includes.Add(O => O.DeliveryMethod);
		Includes.Add(O => O.Items); // Eager Loading
 
		AddOrderByDesc(O => O.OrderDate);
 
		// ApplyPagination
	}
}

أنا محتاج أبعت الـ Buyer Email للـ Spec عشان يشوف هو بيساوي الـ Email ولا لا

public Task<IReadOnlyList<Order>> GetOrdersForUserAsync(string buyerEmail)
{
	var ordersRepo = _unitOfWork.Repository<Order>();
	var spec = new OrderSpecifications(buyerEmail);
	var orders = await ordersRepo.GetAllWithSpecAsync(spec);
	return orders;
}