<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AlexfamDan</title>
    <description>The latest articles on DEV Community by AlexfamDan (@dummy_455773380f24c0073a3).</description>
    <link>https://dev.to/dummy_455773380f24c0073a3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4105071%2F54435f25-47e5-417a-b022-796d4d8bed13.png</url>
      <title>DEV Community: AlexfamDan</title>
      <link>https://dev.to/dummy_455773380f24c0073a3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dummy_455773380f24c0073a3"/>
    <language>en</language>
    <item>
      <title>how to find in order you want</title>
      <dc:creator>AlexfamDan</dc:creator>
      <pubDate>Wed, 02 Sep 2026 02:25:48 +0000</pubDate>
      <link>https://dev.to/dummy_455773380f24c0073a3/how-to-find-in-order-you-want-5be0</link>
      <guid>https://dev.to/dummy_455773380f24c0073a3/how-to-find-in-order-you-want-5be0</guid>
      <description>&lt;p&gt;public async Task&amp;gt; GetAllProductsAsync(&lt;br&gt;
    int pageNumber,&lt;br&gt;
    int pageSize,&lt;br&gt;
    string? search,&lt;br&gt;
    string? sortOrder,&lt;br&gt;
    string? sortBy,&lt;br&gt;
    CancellationToken cancellationToken)&lt;br&gt;
{&lt;br&gt;
    IQueryable query =&lt;br&gt;
        _context.Products&lt;br&gt;
            .AsNoTracking();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ============================
// Search
// ============================

if (!string.IsNullOrWhiteSpace(search))
{
    search = search.Trim();

    query = query.Where(x =&amp;gt;
        x.Name.Contains(search) ||
        x.Category.Contains(search));
}


// ============================
// Sorting
// ============================

query = sortBy?.ToLower() switch
{
    "name" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.Name)
        : query.OrderBy(x =&amp;gt; x.Name),

    "category" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.Category)
        : query.OrderBy(x =&amp;gt; x.Category),

    "price" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.Price)
        : query.OrderBy(x =&amp;gt; x.Price),

    "stock" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.Stock)
        : query.OrderBy(x =&amp;gt; x.Stock),

    "createddate" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.CreatedDate)
        : query.OrderBy(x =&amp;gt; x.CreatedDate),

    _ =&amp;gt; query.OrderByDescending(x =&amp;gt; x.CreatedDate)
};


// ============================
// Pagination
// ============================

pageNumber = pageNumber &amp;lt; 1 ? 1 : pageNumber;

pageSize = pageSize &amp;lt; 1
    ? 10
    : Math.Min(pageSize, 100);

query = query
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize);


// ============================
// Database Query Execution
// ============================

return await query.ToListAsync(cancellationToken);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

</description>
      <category>backend</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>programming</category>
    </item>
    <item>
      <title>Helping with Dev</title>
      <dc:creator>AlexfamDan</dc:creator>
      <pubDate>Tue, 01 Sep 2026 21:55:51 +0000</pubDate>
      <link>https://dev.to/dummy_455773380f24c0073a3/helping-with-dev-34ka</link>
      <guid>https://dev.to/dummy_455773380f24c0073a3/helping-with-dev-34ka</guid>
      <description>&lt;p&gt;public async Task CreateBookingAsync(&lt;br&gt;
    CreateBookingCommand request,&lt;br&gt;
    CancellationToken cancellationToken)&lt;br&gt;
{&lt;br&gt;
    // Get current logged-in employee&lt;br&gt;
    var employeeId = _currentUserService.UserId;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Rule 1: Purpose is required
if (string.IsNullOrWhiteSpace(request.Purpose))
{
    throw new BadRequestException(
        "Purpose is required.");
}

// Rule 2: Travel date cannot be in the past
if (request.TravelDate &amp;lt; DateTime.UtcNow)
{
    throw new BadRequestException(
        "Travel date cannot be in the past.");
}

// Rule 3: Return date cannot be before travel date
if (request.ReturnDate &amp;lt; request.TravelDate)
{
    throw new BadRequestException(
        "Return date cannot be before travel date.");
}

// Get vehicle
var vehicle = await _vehicleRepository.GetByIdAsync(
    request.VehicleId,
    cancellationToken);

if (vehicle == null)
{
    throw new NotFoundException(
        "Vehicle not found.");
}

// Rule 4: Vehicle must be active
if (!vehicle.IsActive)
{
    throw new BadRequestException(
        "This vehicle is not active.");
}

// Rule 5: Check whether vehicle already has
// an approved/allocated booking for these dates
var vehicleAlreadyBooked =
    await _vehicleBookingRepository
        .HasVehicleBookingOverlapAsync(
            request.VehicleId,
            request.TravelDate,
            request.ReturnDate,
            cancellationToken);

if (vehicleAlreadyBooked)
{
    throw new BadRequestException(
        "Vehicle is already booked for the selected dates.");
}

// Rule 6: Check whether employee already has
// an approved/allocated booking for these dates
var employeeAlreadyBooked =
    await _vehicleBookingRepository
        .HasEmployeeBookingOverlapAsync(
            employeeId,
            request.TravelDate,
            request.ReturnDate,
            cancellationToken);

if (employeeAlreadyBooked)
{
    throw new BadRequestException(
        "You already have a booking for the selected dates.");
}

// Create booking
var booking = new VehicleBooking
{
    Id = Guid.NewGuid(),

    VehicleId = request.VehicleId,

    EmployeeId = employeeId,

    BookingStatus = BookingStatus.Pending,

    TravelDate = request.TravelDate,

    ReturnDate = request.ReturnDate,

    Purpose = request.Purpose,

    Destination = request.Destination,

    CreatedDate = DateTime.UtcNow
};

await _vehicleBookingRepository.AddAsync(
    booking,
    cancellationToken);

// Create initial status history
var statusHistory = new BookingStatusHistory
{
    Id = Guid.NewGuid(),

    VehicleBookingId = booking.Id,

    Status = BookingStatus.Pending,

    UpdatedDate = DateTime.UtcNow
};

await _bookingStatusHistoryRepository.AddAsync(
    statusHistory,
    cancellationToken);

return new CreateBookingCommandResponse
{
    BookingId = booking.Id,

    VehicleId = booking.VehicleId,

    BookingStatus = booking.BookingStatus,

    TravelDate = booking.TravelDate,

    ReturnDate = booking.ReturnDate,

    Purpose = booking.Purpose,

    Destination = booking.Destination,

    Message = "Booking created successfully."
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;public async Task HasVehicleBookingOverlapAsync(&lt;br&gt;
    Guid vehicleId,&lt;br&gt;
    DateTime travelDate,&lt;br&gt;
    DateTime returnDate,&lt;br&gt;
    CancellationToken cancellationToken)&lt;br&gt;
{&lt;br&gt;
    return await _context.VehicleBookings.AnyAsync(&lt;br&gt;
        x =&amp;gt;&lt;br&gt;
            x.VehicleId == vehicleId&lt;br&gt;
            &amp;amp;&amp;amp;&lt;br&gt;
            (x.BookingStatus == BookingStatus.Approved&lt;br&gt;
             || x.BookingStatus == BookingStatus.Allocated)&lt;br&gt;
            &amp;amp;&amp;amp;&lt;br&gt;
            x.TravelDate &amp;lt;= returnDate&lt;br&gt;
            &amp;amp;&amp;amp;&lt;br&gt;
            x.ReturnDate &amp;gt;= travelDate,&lt;br&gt;
        cancellationToken);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;public async Task AllocateVehicleAsync(&lt;br&gt;
    AllocateVehicleCommand request,&lt;br&gt;
    CancellationToken cancellationToken)&lt;br&gt;
{&lt;br&gt;
    // Get booking&lt;br&gt;
    var booking = await _vehicleBookingRepository.GetByIdAsync(&lt;br&gt;
        request.BookingId,&lt;br&gt;
        cancellationToken);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (booking == null)
{
    throw new NotFoundException(
        "Booking not found.");
}

// Business Rule:
// Vehicle can be allocated only to a Pending booking.
if (booking.BookingStatus != BookingStatus.Pending)
{
    throw new BadRequestException(
        "Vehicle can be allocated only to a pending booking.");
}

// Get vehicle
var vehicle = await _vehicleRepository.GetByIdAsync(
    request.VehicleId,
    cancellationToken);

if (vehicle == null)
{
    throw new NotFoundException(
        "Vehicle not found.");
}

// Business Rule:
// Vehicle must be active.
if (!vehicle.IsActive)
{
    throw new BadRequestException(
        "This vehicle is not active.");
}

// Business Rule:
// Vehicle cannot be allocated if it already
// has an overlapping approved/allocated booking.
var vehicleAlreadyBooked =
    await _vehicleBookingRepository
        .HasVehicleActiveBookingOverlapAsync(
            request.VehicleId,
            booking.TravelDate,
            booking.ReturnDate,
            booking.Id,
            cancellationToken);

if (vehicleAlreadyBooked)
{
    throw new BadRequestException(
        "Vehicle is already allocated for the selected dates.");
}

// Allocate vehicle
booking.VehicleId = request.VehicleId;

booking.BookingStatus = BookingStatus.Allocated;

// Create status history
var statusHistory = new BookingStatusHistory
{
    Id = Guid.NewGuid(),

    VehicleBookingId = booking.Id,

    Status = BookingStatus.Allocated,

    UpdatedDate = DateTime.UtcNow
};

// Update booking
await _vehicleBookingRepository.UpdateAsync(
    booking,
    cancellationToken);

// Add history
await _bookingStatusHistoryRepository.AddAsync(
    statusHistory,
    cancellationToken);

return new AllocateVehicleCommandResponse
{
    BookingId = booking.Id,

    VehicleId = booking.VehicleId,

    Status = booking.BookingStatus,

    Message = "Vehicle allocated successfully."
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;public async Task CompleteTripAsync(&lt;br&gt;
    CompleteTripCommand request,&lt;br&gt;
    CancellationToken cancellationToken)&lt;br&gt;
{&lt;br&gt;
    // Get booking&lt;br&gt;
    var booking = await _vehicleBookingRepository.GetByIdAsync(&lt;br&gt;
        request.BookingId,&lt;br&gt;
        cancellationToken);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (booking == null)
{
    throw new NotFoundException(
        "Booking not found.");
}

// Business Rule:
// Trip can be completed only after vehicle is allocated.
if (booking.BookingStatus != BookingStatus.Allocated)
{
    throw new BadRequestException(
        "Trip can be completed only after the vehicle is allocated.");
}

// Change status
booking.BookingStatus = BookingStatus.Completed;

// Create status history
var statusHistory = new BookingStatusHistory
{
    Id = Guid.NewGuid(),

    VehicleBookingId = booking.Id,

    Status = BookingStatus.Completed,

    UpdatedDate = DateTime.UtcNow
};

// Update booking
await _vehicleBookingRepository.UpdateAsync(
    booking,
    cancellationToken);

// Add history
await _bookingStatusHistoryRepository.AddAsync(
    statusHistory,
    cancellationToken);

return new CompleteTripCommandResponse
{
    BookingId = booking.Id,

    Status = booking.BookingStatus,

    Message = "Trip completed successfully."
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;public async Task&amp;gt; ViewMyBookingsAsync(&lt;br&gt;
    ViewMyBookingsQuery request,&lt;br&gt;
    CancellationToken cancellationToken)&lt;br&gt;
{&lt;br&gt;
    // Get current logged-in employee&lt;br&gt;
    var employeeId = _currentUserService.UserId;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var bookings = await _vehicleBookingRepository.ViewMyBookingsAsync(
    employeeId,
    request.PageNumber,
    request.PageSize,
    request.Search,
    request.SortOrder,
    request.SortBy,
    cancellationToken);

if (bookings == null || !bookings.Any())
{
    throw new BadRequestException(
        "Bookings not found.");
}

var bookingResponse = new List&amp;lt;ViewMyBookingsQueryResponse&amp;gt;();

foreach (var booking in bookings)
{
    bookingResponse.Add(new ViewMyBookingsQueryResponse
    {
        Id = booking.Id,
        VehicleId = booking.VehicleId,
        BookingStatus = booking.BookingStatus,
        TravelDate = booking.TravelDate,
        ReturnDate = booking.ReturnDate,
        Purpose = booking.Purpose,
        Destination = booking.Destination,
        CreatedDate = booking.CreatedDate
    });
}

return bookingResponse;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;public async Task&amp;gt; ViewMyBookingsAsync(&lt;br&gt;
    Guid employeeId,&lt;br&gt;
    int pageNumber,&lt;br&gt;
    int pageSize,&lt;br&gt;
    string? search,&lt;br&gt;
    string? sortOrder,&lt;br&gt;
    string? sortBy,&lt;br&gt;
    CancellationToken cancellationToken)&lt;br&gt;
{&lt;br&gt;
    IQueryable query =&lt;br&gt;
        _context.VehicleBookings&lt;br&gt;
            .AsNoTracking()&lt;br&gt;
            .Where(x =&amp;gt; x.EmployeeId == employeeId);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Search
if (!string.IsNullOrWhiteSpace(search))
{
    search = search.Trim();

    query = query.Where(x =&amp;gt;
        x.Purpose.Contains(search) ||
        x.Destination.Contains(search));
}

// Sorting
query = sortBy?.ToLower() switch
{
    "traveldate" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.TravelDate)
        : query.OrderBy(x =&amp;gt; x.TravelDate),

    "returndate" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.ReturnDate)
        : query.OrderBy(x =&amp;gt; x.ReturnDate),

    "destination" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.Destination)
        : query.OrderBy(x =&amp;gt; x.Destination),

    "purpose" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.Purpose)
        : query.OrderBy(x =&amp;gt; x.Purpose),

    "status" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.BookingStatus)
        : query.OrderBy(x =&amp;gt; x.BookingStatus),

    "createddate" =&amp;gt; sortOrder?.ToLower() == "desc"
        ? query.OrderByDescending(x =&amp;gt; x.CreatedDate)
        : query.OrderBy(x =&amp;gt; x.CreatedDate),

    _ =&amp;gt; query.OrderByDescending(x =&amp;gt; x.CreatedDate)
};

// Pagination
pageNumber = pageNumber &amp;lt; 1 ? 1 : pageNumber;

pageSize = pageSize &amp;lt; 1
    ? 10
    : Math.Min(pageSize, 100);

query = query
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize);

return await query.ToListAsync(cancellationToken);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

</description>
      <category>backend</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
