是否可以通過編寫一個函數來創建一個「元謂語」,該函數需要2個(或4個,如果需要)lambda表示左側和右側屬性操作數)並讓它生成一個謂詞。類似下面的代碼示例:創建一個接受lambda操作數參數的可重用的「元謂語」函數
OR:
public Expression<Func<Something,bool>> DatesActive<Something>(Expression<Something> startDateOperandSelector, Expression<Something> endDateOperandSelector){
return (startDateOperandSelector, endDateOperandSelector) => (
(startDatePropertySelector >= DateTime.Now)
&& (endDatePropertySelector <= DateTime.Now)
);
}
其中對於每個側或startDatePropertySelector或endDatePropertySelectorSomeStringProperty由拉姆達定義?我還沒有想出如何動態傳遞謂詞表達式的操作數。
我非常希望能夠爲內聯這樣的:
return new Expression<Func<Request,bool>>[]{
r => (r.Id != request.Id) && (!r.Reviewed),
StringEquals(r => r.VendorName, request=>request.VendorName),
NotExpired(r => r.ContractStart, request=>request.ContractEnd),
...
};
* 是否有人有對最佳方式的點子接近呢?我的興趣在於創建「meta」表達式,以便在多個屬性中重複使用相同的表達式時使用。給出具體的例子僅供參考/解釋。非常願意知道這是否愚蠢,如果有更好的方法,很高興學習。 *
如果需要更多背景。
背景:後該表達的更簡單的形式是在地方,我被迫重構處理事實的EntityFramework不把平等,你會如何期待,與其解釋C#這樣的: (rightSide.SomeStringProperty == leftSide.SomeStringProperty)
作爲這樣
(
(rightSide.SomeStringProperty IS NULL AND leftSide.SomeStringProperty IS NULL)
OR (rightSide.SomeStringProperty = leftSide.SomeStringProperty)
)
兩個部分SQL表達式更字面上tranlates它爲:
(rightSide.SomeStringProperty = leftSide.SomeStringProperty)
當然不會返回雙方都爲空的值。顯然,這已在EF6得到糾正(修正:@Slauma指出,這是提供EF5通過UseCSharpNullComparisonBehavior我使用EF4及此版本無法升級。)
我想避免更多的重複代碼,如以下內容:
var where = new Expression<Func<Request,bool>>[]{
r => (r.Id != request.Id) && (!r.Reviewed)
&& (
(r.Address == request.Address)
|| (string.IsNullOrEmpty(r.Address) && string.IsNullOrEmpty(request.Address))
)
&& (
(r.City == request.City)
|| (string.IsNullOrEmpty(r.City) && string.IsNullOrEmpty(request.City))
)
&& (
(r.Province == request.Province)
|| (string.IsNullOrEmpty(r.Province) && string.IsNullOrEmpty(request.Province))
)
&& (
(r.PostalCode == request.PostalCode)
|| (string.IsNullOrEmpty(r.PostalCode) && string.IsNullOrEmpty(request.PostalCode))
)
&& (
(r.Website == request.Website)
|| (string.IsNullOrEmpty(r.Website) && string.IsNullOrEmpty(request.Website))
)
};
您可以使用?運營商? '(r.City ??「」)==(request.City ??「」)' – Jay
這讓我重構了更簡潔的東西。謝謝!但是,如果我不處理空字符串和空同樣這不會在這裏工作。我更感興趣的是能夠參數化類似於將在多個字段中重複的元表達式的東西。 – j0tt
這樣的事情變得棘手。 EF必須將您編寫的代碼轉換爲實際的SQL語句('?== ISNUL()'),否則它將炸燬。通常在這種情況下,我構建查詢鏈並檢查查詢本身之外的條件。 – Jay