簡體   English   中英

c#lambda表達式如果條件在where里面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM