Запрос LINQ-to-Entities в Entity Framework - PullRequest
1 голос
/ 24 февраля 2020

Мне трудно создать запрос LINQ-to-Entities, который бы удовлетворял моим требованиям.

У меня есть две таблицы: Booking и ProcessStatusLog.

Бронирование таблица:

  • PNNumber (PK)
  • AccountName

ProcessStatusLog таблица:

  • ID (PK)
  • PNNumber (FK)
  • InsuranceCode
  • Статус
  • ОбновленоOn

Здесь это пример данных для этих таблиц:

Бронирование Таблица

| PNNumber | Account Name   |
+----------+----------------+
| 11111    | Boston Celtics |
| 22222    | Miami Heat     |
| 33333    | LA Lakers      |

ProcessStatusLog Таблица:

| ID   | PNNumber  | InsuranceCode | Status       | UpdatedOn   |
+------+-----------+---------------+--------------+-------------+
| 1    | 11111     | null          | NEW          | 02/22/2020  |
| 2    | 11111     | FIRE          | FOR REVIEW   | 02/23/2020  |
| 3    | 22222     | null          | NEW          | 02/24/2020  |
| 4    | 22222     | MORTGAGE      | FOR REVIEW   | 02/25/2020  |
| 5    | 22222     | MORTGAGE      | CORRECTION   | 02/26/2020  |
| 6    | 22222     | FIRE          | FOR REVIEW   | 02/27/2020  |
| 7    | 33333     | null          | NEW          | 02/28/2020  |
| 8    | 22222     | FIRE          | APPROVED     | 02/29/2020  |

Сейчас Я хочу получить список бронирований по последнему статусу.

Например: если я хочу отфильтровать брони с последним статусом «ИСПРАВЛЕНИЕ», я получу бронирование с PNNumber 22222.

Если при поиске «ОБЗОР» я получу бронирование с PNNumber 11111.

Если при поиске «НОВОЕ» я получу бронирование с PNNumber 33333.

Как я могу написать EF запрос для этого?

Спасибо.

Ответы [ 5 ]

1 голос
/ 24 февраля 2020
context.ProcessStatusLog.where(x=>x.Status == "FOR REVIEW")
                        .OrderByDescending(x => x.UpdatedOn)
                        .Take(1);
0 голосов
/ 24 февраля 2020

Пока мое понимание вашего вопроса, вы можете попробовать -

var result= context.ProcessStatusLog.OrderByDescending(x => x.UpdatedOn)
                        .FirstOrDefault(x=>x.Status == "CORRECTION");

ИЛИ

var result= context.ProcessStatusLog.where(x=>x.Status == "CORRECTION")
                        .OrderByDescending(x => x.UpdatedOn)
                        .FirstOrDefault();

это вернуть один объект вашего ProcessStatusLog класс.

0 голосов
/ 24 февраля 2020

Попробуйте ниже Query.

context.ProcessStatusLog.where(x=>x.Status == "FOR REVIEW")
.OrderByDescending(x => x.UpdatedOn)
.ToList();
0 голосов
/ 24 февраля 2020

Вы можете использовать Join() для достижения этого.

var result = context.ProcessStatusLog.Join(context.Booking, s => s.PNNumber, b => b.PNNumber, (s, b) => new { booking = b, StatusLog = s).Where(BookingAndStatusLog => BookingAndStatusLog.StatusLog.Status == your_parameter)
                        .OrderByDescending(BookingAndStatusLog  => BookingAndStatusLog.StatusLog.UpdatedOn)
                        .Take(1);
0 голосов
/ 24 февраля 2020
using (var ctx = new SchoolDBEntities())
{
var student = ctx.Students
                .SqlQuery("Select top1 from ProcessStatusLog where Status like '%"+@APPROVED+"%' order by UpdatedOn", new SqlParameter("@APPROVE", yourinputparameter))
                .FirstOrDefault();
}
...