Pankaj sonar Ответов: 2

Как преобразовать SQL-запрос в лямбда-выражение LINQ с помощью внутреннего соединения и подзапроса


Я хочу преобразовать следующий SQL-запрос в лямбда-выражение LINQ.


SELECT     Hod.* 
FROM       (
               SELECT * 
               FROM   tbLease_Approval 
               WHERE  UserRole = 'HOD' 
               AND    IsApproved = 1)
           ) AS Pm 
INNER JOIN (
               SELECT * 
               FROM   tbLease_Approval 
               WHERE  UserRole = 'Finance' 
               AND    IsApproved = 0
           ) AS Hod 
ON         Pm.LeaseNo = Hod.LeaseNo


Что я уже пробовал:

Я попытался сделать запрос для внутреннего соединения. Но не удалось создать часть подзапроса, используя лямбда-выражение LINQ в следующем запросе.
var test = db.Ett_LeaseApprovalDetails.Join(db.Ett_LeaseApprovalDetails,
                            r1 => r1.LeaseNo, r2 => r2.LeaseNo, (r1, r2) => 
                            new { r2.LeaseNo, r2.IsApproved, r2.IsRejected, r2.Remarks });

2 Ответов

Рейтинг:
2

Richard Deeming

Переписать SQL-запроса может сделать вещи проще:

SELECT
    *
FROM
    tbLease_Approval As Hod
WHERE
    Hod.UserRole = 'Finance'
And
    Hod.IsApproved = 0
And
    Exists
    (
        SELECT 1
        FROM tbLease_Approval As Pm
        WHERE Pm.UserRole = 'HOD'
        And Pm.IsApproved = 1
        And Pm.LeaseNo = Hod.LeaseNo
    )
;
Это должно хорошо переводиться на LINQ:
var test = from hod in db.Ett_LeaseApprovalDetails
           where hod.UserRole = "Finance"
           && !hod.IsApproved
           && db.Ett_LeaseApprovalDetails.Any(pm => pm.UserRole = "HOD" && pm.IsApproved && pm.LeaseNo == hod.LeaseNo)
           select hod;


Рейтинг:
1

#realJSOP

Это может вам не помочь, но наша команда помещает сложные запросы в сохраненный процесс и при необходимости использует Linq для фильтрации того, что нам не нужно в приложении. Это оставляет запросы (которые sql server оптимизирован для хорошей работы) в базе данных, а также значительно снижает сложность Linq и снижение производительности в коде C#. Он также позволяет нам развертывать только изменения базы данных, если сложный запрос нуждается в корректировке.

Наконец, ваш запрос кажется слишком сложным. Разве это не сделает работу так же хорошо:

SELECT * 
FROM   tbLease_Approval 
WHERE  (UserRole = 'HOD'     AND IsApproved = 1)
OR     (UserRole = 'Finance' AND IsApproved = 0)