[英]c# lambda expression if condition inside a where
我有一個場景,我使用lambda表達式按名稱,地址和電話號碼過濾數據。 但是當一個屬性沒有值時,我的過濾器會考慮屬性為null的位置,並給出錯誤的結果。 如果屬性為null,是否有任何選項可以使用if條件從三種情況中刪除where條件。 我的意思是有任何情況下添加where / check僅用於具有值的屬性的對象嗎?
var filterCriteria ={
name: "abc",
address:"",
phone:""
}
var Details = _context.LogEntities
.Where(p => p.name == (filterCriteria.name))
.Where(p => p.address== (filterCriteria.address))
.Where(p => p.phone== (filterCriteria.phone))
return Json(Details);
如果您仍希望在名稱,地址或電話為空時返回記錄,則只需在條件中檢查是否為空。
var Details = _context.LogEntities
.Where(p => p.name == null || p.name == (filterCriteria.name))
.Where(p => p.address == null || p.address == (filterCriteria.address))
.Where(p => p.phone == null || p.phone == (filterCriteria.phone))
return Json(Details);
您可以編寫一個擴展方法來有條件地應用過濾器:
public static IQueryable<T> WhereIf<T>(
this IQueryable<T> source, bool condition,
Expression<Func<T, bool>> predicate)
{
if (condition)
return source.Where(predicate);
else
return source;
}
您的查詢變為:
using static System.String;
...
var employees = _context
.LogEntities
.WhereIf(!IsNullOrEmpty(filterCriteria.name), e => e.name == filterCriteria.name)
.WhereIf(!IsNullOrEmpty(filterCriteria.address), e => e.address == filterCriteria.address)
.WhereIf(!IsNullOrEmpty(filterCriteria.phone), e => e.phone == filterCriteria.phone)
.ToList();
在進行過濾時,如果您想要的是在過濾器中考慮null
屬性以匹配集合中相應屬性中的any
值,則應該針對過濾器屬性檢查null,而不是對集合項的屬性進行檢查。 所以對於像這樣的集合
var myCollection = [
{name: "abc",address:"qwerty",phone:"123"},
{name: "abc",address:"xyz",phone:"456"},
{name: "efg",address:"cde",phone:"654"}]
和過濾器一樣
var filterCriteria ={name: "abc",address:"",phone:""}
期望的結果如:
[{name: "abc",address:"qwerty",phone:"123"},
{name: "abc",address:"xyz",phone:"456"}]
你的代碼應該是
var Details = _context.LogEntities
.Where(p => (filterCriteria.name) == null || p.name == (filterCriteria.name))
.Where(p => (filterCriteria.address) == null || p.address== (filterCriteria.address))
.Where(p => (filterCriteria.phone) == null || p.phone== (filterCriteria.phone))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.