dapper C# поиск в базе данный всех полей со значением null
Работаю с dapper недавно.
Есть модель
[Table("test", Schema = "myShema")]
public class MyModel
{
[Key][Column("id")] public short Id { get; set; }
[Column("parent_id")] public short? ParentId { get; set; }
}
ParentId - в бд частично заполнена значениями null
и соответственно метод работающий с бд (осуществляет поиск по ней)
public async Task<IEnumerable<IMyModel>> FindAsync(short? id = null, short? parentId = null)
{
var res = await _xxx.SqlConnection.QueryAsync<MyModel>(
$@"SELECT
mymodel.id AS {nameof(MyModel.Id)},
mymodel.parent_id AS {nameof(MyModel.ParentId)}
FROM
myShema.mymodel as mymodel
WHERE
(@Id IS NULL OR @Id = mymodel.id)
AND (@ParentId IS NULL OR @ParentId = mymodel.parent_id)
",
new
{
Id = id,
ParentId = parentId,
});
return _mapper.Map<IEnumerable<IMyModel>>(res);
}
Задача в том, что нужно выводить только записи где parent_id равен null.... Подскажите, пожалуйста, как это реализовать... например с добавлением нового параметра...
В Бд 50 значений. В коде вызываем
var parents = xxx.FindAsync();
в parents прилетело 50 значений.
var parents = xxx.FindAsync(parentId: 4);
в parents все значения у которых в бд 4 в данном столбце.
необходимо
var parents = xxx.FindAsync(parentId: false)
в parents все значения у которых в бд null в данном столбце.
Ответы (2 шт):
Автор решения: tym32167
→ Ссылка
Проверять код мне некогда и негде, но идея должна быть понятна
public async Task<IEnumerable<IMyModel>> FindAsync(
bool filterById = false,
bool filterByParentId = false,
short? id = null,
short? parentId = null)
{
var query = $@"SELECT
mymodel.id AS {nameof(MyModel.Id)},
mymodel.parent_id AS {nameof(MyModel.ParentId)}
FROM
myShema.mymodel as mymodel";
if (filterById || filterByParentId) query += " WHERE ";
if (filterById) query += " (@Id IS NULL OR @Id = mymodel.id) ";
if (filterById && filterByParentId) query += " AND ";
if (filterByParentId) query += " (@ParentId IS NULL OR @ParentId = mymodel.parent_id) ";
var res = await _xxx.SqlConnection.QueryAsync<MyModel>(
query,
new
{
Id = id,
ParentId = parentId,
});
return _mapper.Map<IEnumerable<IMyModel>>(res);
}
Автор решения: parabol
→ Ссылка
public async Task<IEnumerable<IMyModel>> FindAsync(short? id = null, short? parentId = null, bool? hasParentId = null)
{
var res = await _xxx.SqlConnection.QueryAsync<MyModel>(
$@"SELECT
mymodel.id AS {nameof(MyModel.Id)},
mymodel.parent_id AS {nameof(MyModel.ParentId)}
FROM
myShema.mymodel as mymodel
WHERE
(@Id IS NULL OR @Id = mymodel.id)
AND (@ParentId IS NULL OR @ParentId = mymodel.parent_id)
AND (case
WHEN (@HasParentId IS NOT NULL and @HasParentId is true) Then mymodel.parent_id is not null
WHEN (@HasParentId IS NOT NULL and @HasParentId is false) Then mymodel.parent_id is null
WHEN (@HasParentId IS NULL) Then @HasParentId is null
END)
",
new
{
Id = id,
ParentId = parentId,
HasParentId = hasParentId
});
return _mapper.Map<IEnumerable<IMyModel>>(res);
}