Я использую бесплатную версию 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 ...
Можно ли преобразовать запрос Linq в SQL? Я вижу правильный результат в таблице. И я не понимаю, почему я не вижу SQL, который показал мне эту таблицу? Есть ли инструменты для преобразования Linq в простой SQL без реальных данных и баз данных? (Потому что я не вижу в этом трудностей)
Вы не видите никакого SQL, потому что вы не выполняете никакой SQL! Код Linq2Sql в LinqPad преобразует ваш код linq в SQL, но, поскольку вы его не используете, преобразовывать нечего!
Хорошо спасибо. Есть ли возможность преобразовать код Linq (много кода) в SQL без базы данных и отладки? Я не вижу здесь трудностей, потому что нам нужно преобразовать один стандартный синтаксис в другой стандартный синтаксис (без проверки реальных данных). Например, from contacts in Contacts
- это SELECT ... FROM Contacts AS contacts
.
SQL, сгенерированный LINQ to SQL или EF, сильно зависит от используемого поставщика базы данных и может быть другим - некоторые поставщики вообще не используют SQL. Вы можете, например, создать простую локальную базу данных SQLite с драйвером IQ, а затем просмотреть сгенерированный SQLite SQL.
Вам потребуется поддержка базы данных SQL, если вы хотите использовать функциональность LinqPads для преобразования запросов Linq в SQL за вас. LinqPad также предлагает ряд драйверов, позволяющих использовать несколько источников данных (например, SQLite), которые требуют меньше накладных расходов, чем, скажем, MSSQL. Без базы данных SQL LinqPad вам не поможет.
Если вы хотите продолжить использование функций LinqPads без базы данных, вам нужно будет использовать классы, перечисленные выше, для создания схемы базы данных. Если код был в проекте C# с использованием Visual Studio, Entity Framework может сначала использовать код, чтобы сгенерировать для вас схему БД на основе этих классов.
В вашем коде нет функций, которые связаны / зависят от SQL или базы данных вообще, это загрузка базовых классов и запроса linq. Когда ничего не находится в работоспособном состоянии, вы не можете выполнить и захватить сгенерированный SQL из фактического кода.