2017-05-08 33 views
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)'「

+0

是否有堆棧跟蹤?該方法在對象列表上工作正常,所以我的下一個猜測是EF無法對它進行SQL化。 –

+2

這不是表達式如何與IQueryable一起使用。您需要爲IQueryable生成表達式樹,而不是調用它。表達式由底層提供者評估。 @EdPlunkett你得到它的工作,因爲這是在內存對象,而不是對象到SQL(底層提供程序需要映射的表達式來生成相應的SQL語句)。我無法在評論中解釋這一切,但希望OP能夠獲得主旨。 – vendettamit

+0

@vendettamit你有任何提示如何重構擴展方法,以使這項工作? – Justin

回答

1

我能夠通過分離出來的電話來實現它。這也使它更容易閱讀!

public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, Func<T, string> expression, string queryParam) 
    { 
     if (string.IsNullOrWhiteSpace(queryParam)) 
     { 
      return source; 
     } 

     return source.Where(x => expression(x).Trim().ToLower() == queryParam.Trim().ToLower()); 
    } 

感謝大家的幫助!