Конвертировать T-sql в Linq или Entityframework и не использовать SqlQuery () для необработанных запросов - PullRequest
0 голосов
/ 03 июля 2018

У меня есть таблица, которая называется Signer:

+--------------+----------+---------+--------+--------------+---------+-----------+
|     Name     |    User  |   Order | Signed | CompanyName  | Status  | InvoiceId |
+--------------+----------+---------+--------+--------------+---------+-----------+
|  Anders      |    aa    |       1 |      0 | OvnAnd2      |       0 |     26650 |
|  Peyman      |    pm    |       2 |      1 | OvnAnd2      |       1 |     26650 |
| Siw Ericsson |    se    |       3 |      0 | OvnAnd2      |       0 |     26650 |
|  test        |    test  |       4 |      0 | OvnAnd2      |       0 |     26650 |
|Siw Ericsson  |    se    |       1 |      0 | OvnAnd2      |       0 |     26652 |
|  test        |    test  |       2 |      1 | OvnAnd2      |       0 |     26652 |
|Siw Ericsson  |    se    |       1 |      0 | OvnAnd2      |       0 |     25365 |
+--------------+----------+---------+--------+--------------+---------+-----------+

Цель: Как видите, у меня есть 3 разных InvoiceId. Для каждого InvoiceId я хотел бы найти строку с минимальным номером заказа, в котором значение столбца Status равно 0, а столбец User должен быть se. (Это означает, Показать текущие счета, связанные с пользователями, которые готовы к подписанию, основываясь на его / ее имени пользователя, заказе, подписанных столбцах)

Я придумал этот T-SQL, который отлично работает:

select * from Signer s1
where s1.User = 'se' and Order = (select min(Order) from Signer s2 where s2.InvoiceId = s1.InvoiceId and Signed = 0)

И результат:

+--------------+----------+---------+--------+--------------+---------+-----------+
|     Name     |    User  |   Order | Signed | CompanyName  | Status  | InvoiceId |
+--------------+----------+---------+--------+--------------+---------+-----------+
|Siw Ericsson  |    se    |       1 |      0 | OvnAnd2      |       0 |     26652 |
|Siw Ericsson  |    se    |       1 |      0 | OvnAnd2      |       0 |     25365 |
+--------------+----------+---------+--------+--------------+---------+-----------+

Я хотел бы преобразовать этот запрос из T-Sql в Linq или EntityFramework:

Это мое решение:

        var temp = from x in db.Signers
                    where x.User == Me.UserName &&
                          x.Signed == 0
                          group x by x.InvoiceId
                    into item
                    select new
                    {
                        item.Key,
                        item = item.Min(x => x.Order)
                    };

Возвращает 3 строки, что неверно, потому что Сив должна увидеть связанные счета, которые готовы подписать. (Это означает, что первая строка не должна быть в списке)

+--------------+----------+---------+--------+--------------+---------+-----------+
|     Name     |    User  |   Order | Signed | CompanyName  | Status  | InvoiceId |
+--------------+----------+---------+--------+--------------+---------+-----------+
|  Anders      |    aa    |       1 |      0 | OvnAnd2      |       0 |     26650 |
|Siw Ericsson  |    se    |       1 |      0 | OvnAnd2      |       0 |     26652 |
|Siw Ericsson  |    se    |       1 |      0 | OvnAnd2      |       0 |     25365 |
+--------------+----------+---------+--------+--------------+---------+-----------+

Дополнительная информация: - Как видно из первой таблицы, у нас есть особая логика, согласно которой кто-то может подписывать счета не по порядку, и Peyman является одним из них. - Я не хочу использовать SqlQuery() метод в Entityframework для выполнения запросов t-sql.

Я ценю любую помощь, чтобы найти решение для моей цели. С наилучшими пожеланиями

1 Ответ

0 голосов
/ 03 июля 2018

Я думаю, что это одна из тех ситуаций, когда "пусть" пригодится:

var result = from s in Signers
    let minToSign = Signers.Where(si => 
        si.InvoiceId == s.InvoiceId && si.Signed == 0
    ).Min(si => si.Order)
    where s.User == "se" && s.Order == minToSign
    select s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...