#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, но возвращать только поля из используемого класса. Спасибо