我有一個表達式,它使用DbFunctions
類來計算日期。它工作正常linq-to-entities
但我想重用這個表達式的非數據庫功能。是否有可能檢測是否在數據庫上下文中評估表達式並使用相應的實現?我已經看到了涉及模擬對象的單元測試的解決方案,但我需要在常見的商業邏輯中使用這種表達方式,所以嘲笑看起來不是一個好的解決方案。根據上下文將DbFunctions切換到非數據庫實現
這裏是我的表達:
public static Expression<Func<Transaction, bool>> Expired(int expirationPeriod)
{
return s => s.Status == Status.Created && DbFunctions.AddMinutes(s.UpdateDateUTC, expirationPeriod) < DateTime.UtcNow;
}
我希望能夠做這樣的事情:
public static Expression<Func<Transaction, bool>> Expired(int expirationPeriod)
{
return s => s.Status == Status.Created && MyCustomResolver.AddMinutes(s.UpdateDateUTC, expirationPeriod) < DateTime.UtcNow;
}
其中MyCustomResolver
將使用兩種DbFunctions
或DateTime
實現取決於上下文。現在
定義在LINQ到實體表達或C#函數中使用問題是,如果內部表達式中的數據沒有被調用,那麼問題是如何檢測實際上下文(這個'amIUsingDB'值),而不是每次都明確地傳遞它 – Random
至於「爲什麼」 ,實際的表情更加複雜和對於我來說,每次爲db和non-db上下文編寫兩個單獨的實現看起來像是一個開銷,所以我不知道當表達式取決於實際上下文時,是否可以選擇特定方法的正確實現(如'AddMinutes') 。 – Random
@隨機正確 - 對兩個評論。這就是爲什麼我將該函數外部的'amIUsingDB'*評估移到該函數的外部。您將'MyCustomResolver'設置爲需要知道該信息的解析器,然後再也不用擔心。請注意,有了這個,你在問題中提供的'Expired'方法就可以按你的意願工作。 –