'In c#, how do you convert CAST CASE WHEN and SUM from sql to linq?

Good day, everyone!

I'm working on a c# test automation script, and I have a sql query that returns a few values based on a few checks with cast, Case When, and Sum - but now we need to transfer it to Entity Framework as a linq query, and I'm not sure how to do so.

Could someone please assist me with this?

Here is my sql query

    SELECT
 co.orderId AS OrderId
 ,(SELECT
        COUNT(*)
    FROM ci_orders (NOLOCK) co
    INNER JOIN Customer (NOLOCK) cust
    ON cust.IdCustomer = co.customerId
    WHERE cust.Email = c.Email
    AND co.PaymentTransactionStatusID = 1)
AS CustomerOrdersCount

,co.PitStopStatus AS PitStopStatus

,(SELECT
        SUM(ops.Price + ops.QuantityDiscount)
    FROM OrderProductSelect (NOLOCK) ops
    WHERE ops.OrderId = 2257327)
AS NetPrice
,CAST(CASE WHEN Exists (SELECT
        oi.Id
    FROM OrderIssues (NOLOCK) oi
    LEFT JOIN PitStops ps
        ON ps.Id = oi.PitStopId
    WHERE oi.OrderId = co.orderId
    AND IssueType = 'HighValueOrder') THEN 1
    ELSE 0 END AS BIT)
AS IsHighValuePitStop
FROM ci_orders (NOLOCK) co
INNER JOIN Customer (NOLOCK) c
    ON c.IdCustomer = co.customerId
 WHERE co.orderId =2257327

@eldar - I tried below way

  using (var context = GetDbContext())
        {
            var yellowOrder = context.YellowOrders.FirstOrDefault(x => x.OrderId == orderId);

            var result = (from co in context.Orders
                          join c in context.Customers
                          on co.customerId equals c.IdCustomer
                          where co.orderId == orderId
                          select new
                          {
                              OrderId = orderId,
                              IsHighValuePitStop = (from oi in context.OrderIssues
                                                    join ps in context.PitStops
                                                    on oi.PitStopId equals ps.Id
                                                    where oi.OrderId == orderId && ps.IssueType == "HighValueOrder")
                          }).Any();

            return yellowOrder != null;
        }


Solution 1:[1]

You can achieve Case When in linq with a ternary (?:) operator. And since your queries are mostly inner selects your linq should look like this :

var result = await (
from co in context.ci_orders 
join c in context.Customers on co.customerId eqals c.IdCustomer
where co.orderId =2257327
select new { // here your inner selects go
OrderId = co.orderId,
IsHighValuePitStop = (from oi in context.OrderIssues 
                      join ps in context.PitStops on oi.PitStopId equals ps.Id
                      where oi.OrderId = co.orderId and oi.IssueType = 'HighValueOrder').Any(),  // you could use ternary operator but Any already returns a boolean value ? true : false would be meaningless
NetPrice = context.OrderProductSelect.Where(r=> r.OrderId = 2257327).Sum(ops=> ops.Price + ops.QuantityDiscount),
co.PitStopStatus,
CustomerOrdersCount = (from co in context.ci_orders
                       join cust context.Customer on co.customerId equals cust.IdCustomer
                       where cust.Email = c.Email
    && co.PaymentTransactionStatusID = 1
select co).Count()
}).ToArrayAsync()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1