LINQPad: получить простой SQL-запрос из жестко запрограммированных объектов

Я использую бесплатную версию LinqPAD.

У меня есть только файлы .cs с кодом. Я не могу запустить и отладить его. У меня нет базы данных. (И я не программист на C#.)
Мне нужно преобразовать запросы Linq в необработанный запрос SQL (MsSql). Я хочу увидеть простой SQL-запрос.

Итак, я открываю LinqPAD и пишу жестко запрограммированные объекты / классы, которые представляют три таблицы из БД.
Я переключаюсь на "Программу C#".

public class ContactModel
{
    public int UserSecondId { get; set; }
    public int UserId { get; set; }
    public int OrganizationId { get; set; }
    public bool IsPrimary { get; set; }
}

class Contacts
{
    public int OrganizationId { get;set; }
    public int UserId { get;set; }
    public char IsPrimary { get;set; }
}

class Organizations
{
    public int Id { get;set; }
    public int SecondId { get;set; }
}

class Users
{
    public int Id { get;set; }
    public char IsActive { get;set; }
    public int SecondId { get;set; }
}

void Main()
{

    List<Contacts> Contacts = new List<Contacts>();
    Contacts.Add(new Contacts { OrganizationId = 1, UserId = 1, IsPrimary = 'Y' });
    Contacts.Add(new Contacts { OrganizationId = 2, UserId = 1, IsPrimary = 'Y' });

    List<Organizations> Organizations = new List<Organizations>();
    Organizations.Add(new Organizations { Id = 1, SecondId = 1 });
    Organizations.Add(new Organizations { Id = 2, SecondId = 2 });

    List<Users> Users = new List<Users>();
    Users.Add(new Users { Id = 1, SecondId = 1, IsActive = 'Y' });
    Users.Add(new Users { Id = 2, SecondId = 1, IsActive = 'Y' });

    int[] orgSecondIdList = { 1, 2 };

    var query =
        from contacts in Contacts
        from orgs in Organizations.Where(o => o.Id == contacts.OrganizationId)
        from users in Users.Where(o => o.Id == contacts.UserId)
        where contacts.IsPrimary == 'Y' && users.IsActive == 'Y' &&
        orgSecondIdList.Contains(orgs.SecondId)
        select new ContactModel
        {
            OrganizationId = contacts.OrganizationId,
            UserId = contacts.UserId,
            UserSecondId = users.SecondId
        };

    query.Dump();

}

Нажимаю run.
LinqPAD показывает мне таблицу в Визуализаторе. Но вкладка SQL пуста.
Что не так? Могу ли я получить необработанный SQL-запрос? Нравится SELECT ... FROM ...

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

Alex K. 11.12.2018 17:14

Можно ли преобразовать запрос Linq в SQL? Я вижу правильный результат в таблице. И я не понимаю, почему я не вижу SQL, который показал мне эту таблицу? Есть ли инструменты для преобразования Linq в простой SQL без реальных данных и баз данных? (Потому что я не вижу в этом трудностей)

user5367575 11.12.2018 17:50

Вы не видите никакого SQL, потому что вы не выполняете никакой SQL! Код Linq2Sql в LinqPad преобразует ваш код linq в SQL, но, поскольку вы его не используете, преобразовывать нечего!

Chris Dunaway 11.12.2018 18:18

Хорошо спасибо. Есть ли возможность преобразовать код Linq (много кода) в SQL без базы данных и отладки? Я не вижу здесь трудностей, потому что нам нужно преобразовать один стандартный синтаксис в другой стандартный синтаксис (без проверки реальных данных). Например, from contacts in Contacts - это SELECT ... FROM Contacts AS contacts.

user5367575 11.12.2018 18:37

SQL, сгенерированный LINQ to SQL или EF, сильно зависит от используемого поставщика базы данных и может быть другим - некоторые поставщики вообще не используют SQL. Вы можете, например, создать простую локальную базу данных SQLite с драйвером IQ, а затем просмотреть сгенерированный SQLite SQL.

NetMage 12.12.2018 00:20
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
562
1

Ответы 1

Вам потребуется поддержка базы данных SQL, если вы хотите использовать функциональность LinqPads для преобразования запросов Linq в SQL за вас. LinqPad также предлагает ряд драйверов, позволяющих использовать несколько источников данных (например, SQLite), которые требуют меньше накладных расходов, чем, скажем, MSSQL. Без базы данных SQL LinqPad вам не поможет.

Если вы хотите продолжить использование функций LinqPads без базы данных, вам нужно будет использовать классы, перечисленные выше, для создания схемы базы данных. Если код был в проекте C# с использованием Visual Studio, Entity Framework может сначала использовать код, чтобы сгенерировать для вас схему БД на основе этих классов.

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