Apakah ada cara untuk mengabaikan ekspresi true awal, jika parameter untuk kueri disediakan

var query = ctx.Articles
                    .AsNoTracking()
                    .WithSmallIncludes();

Expression<Func<DbContext.Article, bool>> searchCondition = m => true;

if (!string.IsNullOrWhiteSpace(request.Title))
    searchCondition = searchCondition.Or(m => m.Title.Contains(request.Title));


if (!string.IsNullOrWhiteSpace(request.Summary))
     searchCondition = searchCondition.Or(m => m.Summary.Contains(request.Summary));

 query = query.AsExpandable().Where(searchCondition);

Saat ini selalu mengembalikan semuanya, menyebabkan ekspresi sama dengan true OR something OR Something.

Jika saya mengubah ekspresi awal menjadi false, maka itu tidak akan pernah mengembalikan data apa pun.

0
Robert 17 Maret 2017, 18:12

2 jawaban

Jawaban Terbaik

Jika saya mengubah ekspresi awal menjadi false, maka itu tidak akan pernah mengembalikan data apa pun.

Itu seharusnya hanya terjadi jika tidak ada yang cocok dengan kriteria pencarian Anda, atau jika tidak ada kriteria pencarian yang disediakan. Jika tidak ada yang cocok dengan kriteria, maka ini adalah perilaku yang benar secara teknis (atau ada bug/data buruk di tempat lain). Jadi yang perlu Anda fokuskan adalah tidak menerapkan kriteria jika tidak ada pencarian yang disediakan. Sebagai contoh:

var query = ctx.Articles
                    .AsNoTracking()
                    .WithSmallIncludes();

if(string.IsNullOrWhiteSpace(request.Title) && string.IsNullOrWhiteSpace(request.Summary))
    return query;

Expression<Func<DbContext.Article, bool>> searchCondition = m => false;

if (!string.IsNullOrWhiteSpace(request.Title))
    searchCondition = searchCondition.Or(m => m.Title.Contains(request.Title));


if (!string.IsNullOrWhiteSpace(request.Summary))
     searchCondition = searchCondition.Or(m => m.Summary.Contains(request.Summary));

 query = query.AsExpandable().Where(searchCondition);

Saya pribadi mungkin akan fokus untuk membuat daftar kriteria, dan hanya memeriksa di bagian akhir untuk melihat apakah ada kriteria, dan hanya menggabungkannya menjadi ekspresi jika ada. Itu akan kurang rawan kesalahan jika Anda akhirnya menambahkan lebih banyak komponen yang dapat dicari di masa mendatang.

1
StriplingWarrior 17 Maret 2017, 15:20

Anda dapat menyetel searchCondition ke null dan melewatkan ekspresi Or pertama.

Expression<Func<DbContext.Article, bool>> searchCondition = null;
Expression<Func<DbContext.Article, bool>> filterCondition = null;

if (!string.IsNullOrWhiteSpace(request.Title))
{
    searchCondition = m => m.Title.Contains(request.Title);
}

if (!string.IsNullOrWhiteSpace(request.Summary))
{
     filterCondition = m => m.Summary.Contains(request.Summary);
     if(searchCondition == null) 
        searchCondition  = filterCondition;
     else   
        searchCondition = searchCondition.Or(filterCondition);
}

if(searchCondition != null)
   query = query.AsExpandable().Where(searchCondition);
1
Aducci 17 Maret 2017, 15:23