0
我想創建一個where子句,我可以通過一個func和一個屬性然後比較它們。我有一長串不同的屬性,我需要比較,所以我想要一個擴展方法來包裝它。有條件的通用其中等於實體框架中的子句
這是我要如何使用它:
string transactionNumber = "12345";
Queryable<TranCard> transactions = _context.TranCard
.WhereEquals(t => t.TransactionNumber, transactionNumber)
.ToList();
這裏的擴展方法我現在有這是造成我的問題:
public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, Func<T, string> expression, string queryParam)
{
return source.Where(t => string.IsNullOrWhiteSpace(queryParam)
|| expression != null
&& string.Equals(queryParam.Trim(), expression.Invoke(t).Trim(), StringComparison.OrdinalIgnoreCase));
}
當我嘗試運行此它拋出以下運行時錯誤消息: 「爲調用方法提供的參數數量不正確」布爾等於(System.String,System.String,System.StringComparison)'「
是否有堆棧跟蹤?該方法在對象列表上工作正常,所以我的下一個猜測是EF無法對它進行SQL化。 –
這不是表達式如何與IQueryable一起使用。您需要爲IQueryable生成表達式樹,而不是調用它。表達式由底層提供者評估。 @EdPlunkett你得到它的工作,因爲這是在內存對象,而不是對象到SQL(底層提供程序需要映射的表達式來生成相應的SQL語句)。我無法在評論中解釋這一切,但希望OP能夠獲得主旨。 – vendettamit
@vendettamit你有任何提示如何重構擴展方法,以使這項工作? – Justin