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);
        }
→ Ссылка