Выбор данных из таблицы tow с использованием LINQ на страницах razor ядра Asp

#sql #linq #asp.net-core

#sql #linq #asp.net-core

Вопрос:

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

  public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }

 }
  

и:

 public class UsersAccessDepartments
    {
        public int Id { get; set; }
        public string UserId { get; set; }
        public int DepartmentId { get; set; }
    }
  

Данные выглядят следующим образом:
Отдел

 1   Management      
2   Finiance    
5   Reciption   
  

Пользовательские отделы доступа:

 1   9c424b6e-fd57-4be7-b47a-2db67b29f651    1
2   9c424b6e-fd57-4be7-b47a-2db67b29f651    2
3   9c424b6e-fd57-4be7-b47a-2db67b29f651    3007
4   9c424b6e-fd57-4be7-b47a-2db67b29f651    3008
5   c4beb529-bb86-439e-a375-4f4cce3f9054    1
6   c4beb529-bb86-439e-a375-4f4cce3f9054    2
7   247779db-ad5f-4128-ae40-7f44cc3c0c71    3007
  

Я хотел бы выбрать отделы с новыми поданными данными, которые показывают, находится ли запрашиваемый пользователь в отделе или нет:
это SQL и его работа:

 Select D.Id, D.Name,
IIF((select UA.Id from UsersAccessDepartments UA where UA.DepartmentId=D.Id and  
UA.UserId='247779db-ad5f-4128-ae40-7f44cc3c0c71') is null ,
'false','true') Selected
from Department D
  

Вот какие результаты выглядят :

 Id     Name         Selected
1      Management   false
2      Finiance     false
5      Reciption    false
2005    CFO         false
3007    IT          true
3008    Cashier     true
  

На страницах asp.core razor я могу использовать только:

 db.Department.FromSql(sql)
  

который принимал файлы из одной таблицы.
Или я должен использовать:

 db.Database.ExecuteSqlCommand(sql);
  

который не возвращает данные.
последний доступный вариант для использования ADO.Net

    command.CommandText = "Your Sql Query";
    context.Database.OpenConnection();
    using (var result = command.ExecuteReader())
    {
        // do something with result
    }
  

и я не хочу использовать это.
Мой вопрос:

Могу ли я запустить выше sql с использованием EF core?

как создать оператор Linq, эквивалентный моему приведенному выше запросу select?

Ответ №1:

Я обнаружил, что этот linq выполняет всю работу за меня:

 (from c in _db.Department
                                 select new SelectListItem
                                 {
                                     Value = c.Id.ToString(),
                                     Text = c.Name,
                                     Selected = (from UA in _db.UsersAccessDepartments
                                                where UA.UserId== TheUser.Id amp;amp; UA.DepartmentId==c.Id
                                                select UA.Id).Count()==0? false: true
                                 }).ToList();
  

Комментарии:

1. Хорошая работа. Что касается другого вопроса о Can i run above sql using EF core? , просто добавьте свойство public DbQuery<DepartmentUASelected> DepartmentUASelecteds { get; set; } для вашего AppDbContext , а затем запустите var y=_context.Query<DepartmentUASelected>().FromSql(@" Select D.Id, D.Name, IIF( (select UA.Id from UsersAccessDepartments UA where UA.DepartmentId = D.Id and UA.UserId = '247779db-ad5f-4128-ae40-7f44cc3c0c71' ) is null, CAST( 0 as BIT ), CAST( 1 as BIT ) ) Selected from Department D").ToList();

2. Хитрость в том, чтобы получить значение bool, используйте CAST(1 as bit) / ` CAST(0 as bit)

3. Это здорово — использовать 0,1 для bool. Но самое классное, что я понимаю, что могу использовать любой sql в FromSql, но возвращать только поля из используемого класса. Спасибо