動態拼接LINQ查詢條件的解決方案

2021-10-14 02:45:38 字數 3331 閱讀 1315

**:

開發中,需要根據使用者選擇的過濾條件從資料庫中查詢資料。過濾條件包括等於(」==」)、不等於(「!=」)、大於(「>」)、小於(」<」)、大於等於(「>=」)、小於等於(「<=」)、包含(」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...