Как я могу преобразовать этот SQL-запрос в linq, когда у меня есть подзапрос, группировка и предложение?

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

select invoice, date, amount, Name 
from payments 
where invoice in (select invoice
                  from payments
                  where invoicelike 'EVENT%' 
                    and status = 3 
                    and date >= '2023-11-01 00:00'
                  group by invoice
                  having count(*) > 1)
order by invoice, date desc

Согласно вашему сценарию, вы можете разбить этот запрос на две части в linq. В первой части выставляйте счет по событию, а затем фильтруйте платежи, чтобы включить только те, чей счет находится в ранее отфильтрованных счетах в первой части.

Md Farid Uddin Kiron 01.08.2024 08:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это, дело в том, что мы можем использовать dbContext внутри метода Where, который превращается в подзапрос:

var date = new DateTime(2023, 11, 1);
var result = await dbContext.Payments
    .Where(p => dbContext.Payments /*Here is the sub query*/
        .Where(sub => sub.Invoice.StartWith("EVENT")
            && sub.Status == 3
            && sub.Date >= date)
        .GroupBy(sub => sub.Invoice)
        .Where(g => g.Count() > 1)
        .Select(g => g.Key)
        .Contains(p.Invoice)/*This will be translated to IN query*/)
    .OrderBy(p => p.Invoice)
    .ThenByDescending(p => p.Date)
    .Select(p => new 
    {
        p.Invoice,
        p.Date,
        p.Amount,
        p.Name
    })
    .ToListAsync();

Это будет всего один запрос к базе данных :)

Ответ принят как подходящий

Да, этот запрос можно перевести на LINQ:

var date = new DateTime(2023, 11, 1);
var forFilter = context.Payments
    .Where(x => x.Invoice.StartsWith("EVENT") && x.Status == 3 && x.Date > date)
    .GroupBy(x => x.Invoice)
    .Where(x => x.Count() > 1)
    .Select(x => x.Key);

var data = await context.Payments
    .Where(x => forFilter.Contains(x.Invoice))
    .ToArrayAsync(cancellationToken);

Пример: я реализовал простой пример, используя свою базу данных:

app.MapGet("/get-special", async (ExampleWebApiContext context, CancellationToken cancellationToken) =>
{
    var forFilter = context.Movies
        .Where(x => x.ReleaseYear > 1000)
        .GroupBy(x => x.Id)
        .Where(x => x.Count() > 1)
        .Select(x => x.Key);

    var data = await context.Movies
        .Where(x => forFilter.Contains(x.Id))
        .ToArrayAsync(cancellationToken);

    return data;
});

который произвел запрос по желанию:

@AndrewMorton Хороший улов, исправлено :)

Michał Turczyn 01.08.2024 09:25

Другие вопросы по теме

Похожие вопросы

Проблема развертывания Blazor WASM Core в Azure
Преобразование оператора foreach в оператор выбора
Что происходит, когда несколько задач C# запускаются после завершения другой задачи?
ASP .NET Core — расширение @Html.EditorFor для добавления <span>
Netwonsoft JsonConvert.Deserialization выдает исключение JsonSerializationException: «Ошибка преобразования значения «Имя моего пользовательского объекта» в тип «System.Type»
Как обеспечить автоматическое масштабирование для CollectionView в объекте Popup из CommunityToolkit.Maui после его заполнения с помощью события нажатия кнопки на платформе Windows?
Перенаправление вызова .NET Core OIDC не работает с интерфейсом Angular
Как добавить несколько веб-приложений Blazor в существующий веб-API
Веб-приложение .Net 8 Blazor (сервер) -> Начните с языка браузера и разрешите пользователю менять язык через раскрывающийся список
Что означает этот вариант значка проекта CsProj в обозревателе решений Visual Studio 2022?