2017-06-01 55 views
0

我有一個表達式,它使用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將使用兩種DbFunctionsDateTime實現取決於上下文。現在

回答

0

最後我用下面的方法:

  1. 定義一個函數DbFunction屬性。以此方式,使用相應的SQL函數如果如果在非分貝上下文中執行

    /// <summary> 
    /// Utilize functions for both Linq-to-Entities and non-db context 
    /// </summary> 
    public static class MyCustomResolver 
    { 
        [DbFunction("Edm", "AddMinutes")] 
        public static DateTime? AddMinutes(DateTime? timeValue, int addValue) 
        { 
         return timeValue?.AddMinutes(addValue); 
        } 
    } 
    
  2. 生成使用輔助功能表達上述

    public static Expression<Func<Transaction, bool>> Expired(int expirationPeriod) 
    { 
        return s => s.Status == Status.Created && MyCustomResolver.AddMinutes(s.UpdateDateUTC, expirationPeriod) < DateTime.UtcNow; 
    } 
    
0
interface ICustomResolver 
{ 
    DateTime AddMinutes(DateTime, int); 
} 

public class DbCustomResolver : ICustomResolver 
{ 
    public DateTime AddMinutes(DateTime time, int minutes) 
    { 
     return DbFunctions.AddMinutes(time, minutes); 
    } 
} 

public class NonDbCustomResolver : ICustomResolver 
{ 
    public DateTime AddMinutes(DateTime time, int minutes) 
    { 
     return time.AddMinutes(minutes); 
    } 
} 


ICustomResolver MyCustomResolver = 
    amIUsingDB ? new DbCustomResolver() : new NonDbCustomResolver(); 

,我想一個可以讓內部AddMinutes上的飛,但爲什麼決心?一次做if()最好每次都做。

+0

定義在LINQ到實體表達或C#函數中使用問題是,如果內部表達式中的數據沒有被調用,那麼問題是如何檢測實際上下文(這個'amIUsingDB'值),而不是每次都明確地傳遞它 – Random

+0

至於「爲什麼」 ,實際的表情更加複雜和對於我來說,每次爲db和non-db上下文編寫兩個單獨的實現看起來像是一個開銷,所以我不知道當表達式取決於實際上下文時,是否可以選擇特定方法的正確實現(如'AddMinutes') 。 – Random

+0

@隨機正確 - 對兩個評論。這就是爲什麼我將該函數外部的'amIUsingDB'*評估移到該函數的外部。您將'MyCustomResolver'設置爲需要知道該信息的解析器,然後再也不用擔心。請注意,有了這個,你在問題中提供的'Expired'方法就可以按你的意願工作。 –