мне нужно сделать это SQL в ORMLite Sql Server: (Если я прохожу 0 в параметрах, то я удалить фильтр, как и в SQL:ServiceStack ORMLite Sql Server * дополнительный фильтр
declare @departmentId int = 0;
declare @projectTaskStatusId int = 0;
select * from ProjectTask t
join Project p on p.ProjectId = t.ProjectId
where
(p.DepartmentId = @departmentId or @departmentId = 0) and
(t.ProjectTaskStatusId = @projectTaskStatusId or @projectTaskStatusId = 0)
Я создал этот код ниже, но это не работает, что это лучший способ сделать это, где в ORMLite SQL Server?
dbCon.LoadSelectAsync(x => (x.Project.DepartmentId == departmentId || departmentId == 0) && (x.ProjectTaskStatusId == projectTaskStatusId || projectTaskStatusId == 0));
Я мог заставить его работать, используя код ниже (но это с помощью лямбда и не прямо OrmLite:
var tasks = await dbCon.LoadSelectAsync<ProjectTask>(x => x);
return tasks.Where(x => (departmentId == 0 || x.Project.DepartmentId.Equals(departmentId)) && (projectTaskStatusId == 0 || x.ProjectTaskStatusId.Equals(projectTaskStatusId)));
После помощи вас, ребята, я мог бы сделать решение ниже, однако, я думаю, что это дорого, потому что я не могу использовать LoadReferences только SelectAsync, а затем мне нужно сделать foreach, чтобы вручную загружать каждую ссылку :
var query = dbCon.From<ProjectTask>()
.Join<ProjectTask, Project>((pt, p) => pt.ProjectId == p.Id)
.Where<Project>(p => p.DepartmentId == departmentId || departmentId == 0)
.And<ProjectTask>(pt => pt.ProjectTaskStatusId == projectTaskStatusId || projectTaskStatusId == 0);
var tasks = await dbCon.SelectAsync(query);
// Load the references
foreach (var item in tasks)
{
if (item.ProjectId > 0)
item.Project = await dbCon.SingleByIdAsync<Project>(item.ProjectId);
if (item.AssignedToId > 0)
item.AssignedTo = await dbCon.SingleByIdAsync<Employee>(item.AssignedToId);
if (item.RequestedById > 0)
item.RequestedBy = await dbCon.SingleByIdAsync<Employee>(item.RequestedById);
if (item.ProjectTaskStatusId > 0)
item.ProjectTaskStatus = await dbCon.SingleByIdAsync<ProjectTaskStatus>(item.ProjectTaskStatusId);
}
return tasks;
Это сработало! Однако только при использовании: SelectAsync, если я использую: LoadSelectAsync, у меня есть ошибка: Код ошибки SqlException Сообщение Неоднозначное название столбца 'ProjectId'. –
LoadSelectAsync может автоматически загружать все мои ссылки, поэтому я бы хотел использовать его, чтобы не загружать после каждой ссылки с помощью команды: LoadReference –
Я отправил новую проблему в ServiceStack github, спасибо! –