**:
開發中,需要根據使用者選擇的過濾條件從資料庫中查詢資料。過濾條件包括等於(」==」)、不等於(「!=」)、大於(「>」)、小於(」<」)、大於等於(「>=」)、小於等於(「<=」)、包含(」in」)、不包含(」out」)八種。過濾條件之間可以是「and」和「or」兩種關係。過濾條件支援的資料型別有整型和字串等。使用者選擇的過濾條件通過json資料提交給後端,後端反序列化後得到過濾條件物件,該物件是filtermodel類的例項,下面是filtermodel類的定義。
public class filtermodel
//過濾條件中使用的資料列
public string action //過濾條件中的操作:==、!=等
public string logic //過濾條件之間的邏輯關係:and和or
public string value //過濾條件中的操作的值
public string datatype //過濾條件中的操作的字段的型別
}
資料庫操作使用ado.net ef技術,查詢使用linq。而linq的擴充套件方法接收的是乙個lambda表示式作為查詢條件。那麼怎樣可以將使用者選擇的查詢條件轉換成需要的lambda表示式呢?本文給出了自己的解決方案。
首先,定義下面的泛型方法getfilterexpression,該方法完成lambda表示式的拼接。getfilterexpression方法中泛型引數t為需要操作的資料庫表物件,輸入引數為filtermodel類的例項集合,包含使用者選擇的所有條件,遍歷該集合,呼叫createlambda()方法生成條件對應的lambda表示式,雖有根據條件之間的關係是「and」還是「or」完成lambda表示式的拼接工作。
public static expression> getfilterexpression(listfilterconditionlist)
else
else}}
}}
catch (exception ex)
return condition;
}
接下來,介紹createlambda()方法的邏輯,該方法完成過濾條件到lambda表示式的生成操作。
public static expression> createlambda(filtermodel filtercondition)
else if ("!=".equals(filtercondition.action))
else if (">".equals(filtercondition.action))
else if ("<".equals(filtercondition.action))
else if (">=".equals(filtercondition.action))
else if ("<=".equals(filtercondition.action))
else if ("in".equals(filtercondition.action) && "1".equals(filtercondition.datatype))
else if ("out".equals(filtercondition.action) && "1".equals(filtercondition.datatype))
else
}
createlambda()方法根據判斷條件的型別,呼叫expression的equal、notequal、greaterthan、lessthan、lessthanorequal、greaterthanorequal方法來生成lambda表示式,而對於」包含」和」不包含」,需要呼叫字串的contains()方法來完成。而這部分邏輯在getexpressionwithmethod()和getexpressionwithoutmethod()方法中實現。
「不包含」是在可看成是」 包含」的否定(not)。
public static expression> getexpressionwithmethod(string methodname, filtermodel filtercondition)
public static expression> getexpressionwithoutmethod(string methodname, filtermodel filtercondition)
/// /// 生成類似於p=>p.values.contains("***");的lambda表示式
/// parameterexpression標識p,propertyname表示values,propertyvalue表示"***",methodname表示contains
/// 僅處理p的屬性型別為string這種情況
///
///
///
///
///
///
private static methodcallexpression getmethodexpression(string methodname, string propertyname, string propertyvalue, parameterexpression parameterexpression)
);var somevalue = expression.constant(propertyvalue, typeof(string));
return expression.call(propertyexpression, method, somevalue);
}
最後,介紹一下拼接lambda表示式的實現**。linqbuilder類提供 or()和and()來拼接關係是」且」和」或」的lambda表示式。這部分****於網路。
public static class linqbuilder
/// /// 預設false條件
///
///
///
public static expression> false()
/// /// 拼接 or 條件
///
///
///
///
///
public static expression> or(this expression> exp, expression> condition)
/// /// 拼接and條件
///
///
///
///
///
public static expression> and(this expression> exp, expression> condition)
}
動態拼接LINQ查詢條件
在實際開發過程中,expression查詢的條件總是多樣的,新建乙個擴充套件類支援動態拼接條件。public static class predicateextensions 機關函式應用false時 單個and無效,多個and無效 單個or有效,多個or有效 混應時寫在or後面的and有效。即,設...
多條件動態LINQ 組合查詢
本文章 參考 以往我們都是通過判斷的方式來拼接查詢的sql字串,但是現在我們面對是強型別的linq查詢,是否可以很方便的進行類似查詢。eg string userid string.empty userid e351d301 f64b 412c b9ef 573f41235af2 string us...
oracle資料庫動態拼接查詢條件解決方案
在專案中遇到需要動態拼接查詢條件的需求,現將解決方案列於下。一 select from table t where param is null or t.filed param 使用方式 可以在拼接查詢條件時進行判斷,若param存在則傳該引數,若不存在則不傳任何引數。二 select from t...