我有一個 mvc .net 核心應用程式,其中向用戶顯示了一些資料,并且可以根據他/她提供的一些輸入過濾該資料。如果沒有給出過濾器/約束,則應該回傳 while 物體集。
我找到了這個例子,并發現第二個答案非常簡潔,關于我想做的事情。
所以我在控制器的底部添加了這個東西:
public static class QueryableEx
{
public static IQueryable<T> Where<T>(
this IQueryable<T> @this,
bool condition,
Expression<Func<T, bool>> @where)
{
return condition ? @this.Where(@where) : @this;
}
}
然后進行此控制器操作,該操作通過三個可能的輸入之一進行過濾:
[HttpPost]
public IActionResult query(QueryModel query)
{
List<CustomerModel> customers = new List<CustomerModel>();
var db = new DemoContext();
customers = db.Customers
.Where(query.Name != null, x => x.Name == query.Name)
.Where(query.Surname != null, x => x.Surname == query.Surname)
.Where(query.Age != null, x => x.Age == query.Age)
.ToList();
return View("Index", customers);
}
這就像一個魅力,如果我輸入某個名字,那么我只會得到那個名字的結果,反之亦然。
不過有一個問題。如果所有輸入欄位都為空,則過濾掉所有內容。我希望相反的情況發生,如果沒有輸入過濾器,那么就回傳所有內容。
我該怎么做呢?如果所有輸入欄位都為空,是否確保不進行過濾?
編輯
根據要求,我這里是我用于查詢的模型
public class QueryModel
{
public string Name {get;set; }
public string Surname { get; set; }
public uint Age { get; set; }
}
這是客戶之一:
public class CustomerModel
{
public int Id{get;set; }
[Required]
public string Name {get;set; }
[Required]
public string Surname { get; set; }
[Required]
[Range(18,110)]
public uint Age { get; set; }
[Required]
public virtual AdressModel Adress { get; set; }
[Required]
public DateTime Created { get; set; }
[Required]
public virtual List<PurchaseModel> purchases { get; set; }
}
uj5u.com熱心網友回復:
您的模型引數不可為空,因此我懷疑您最終會尋找年齡為零的客戶,因此沒有結果。
嘗試:
customers = db.Customers
.Where(query.Name != default, x => x.Name == query.Name)
.Where(query.Surname != default, x => x.Surname == query.Surname)
.Where(query.Age != default, x => x.Age == query.Age)
.ToList();
在每種情況下將“null”更改為“default”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494605.html
