2017-09-25 79 views
2

此刻我有一個linq查詢,其中存在一個方法。我收到錯誤LINQ to Entities does not recognize the method。所以我發現我可以將該方法轉換爲表達式LINQ to Entities does not recognize the method,但我想知道是否有一種乾淨而簡單的方式將表達式添加到我的linq查詢中。在linq查詢中使用表達式

原始方法

public bool IsAvailable() 
{ 
    return Eligibility.ProgramType == InteractionProgramTypes.Available; 
} 

改爲

public System.Linq.Expressions.Expression<Func<InteractionProgram, bool>> IsAvailable() 
{ 
    return i => i.Eligibility.ProgramType == InteractionProgramTypes.Available; 
} 

的LINQ查詢而不表達

x => x.ActivityDate <= endDate && x.IsAvailable() 

Linq查詢與表達

x => x.ActivityDate <= endDate && x.IsAvailable().Compile() 

當我這樣做時,我得到編譯器錯誤,& &運算符不能應用於操作數。

請問我該如何將表達式追加到我當前的linq查詢中。

+0

你是什麼意思'.Compile()',這是什麼結果? –

+0

@JericCruz https://msdn.microsoft.com/en-us/library/bb345362(v=vs.110).aspx – Master

+0

錯誤是由SQL提供的嗎?或編譯/解釋? – GGO

回答

0

既然你已經轉換IsAvailable返回Expression<Func<InteractionProgram,bool>>,所有你需要做的是通過調用此方法的Where方法IQueryable<T>的結果:

var res = ctx.InteractionPrograms.Where(InteractionProgram.IsAvailable()); 

注意,爲了讓這個來編譯方法需要是靜態的。此外,你可以把一個屬性的甚至更好的可讀性:

class InteractionProgram { 
    public static Expression<Func<InteractionProgram,bool>> IsAvailable {get;} = 
     i => i.Eligibility.ProgramType == InteractionProgramTypes.Available; 
    ... // other members of the class 
} 

... 
var res = ctx.InteractionPrograms.Where(InteractionProgram.IsAvailable); 

那其他條件x.ActivityDate < =結束日期。那去哪裏?

其他條件在IsAvailable條件之前或之後立即分開Where條款。 EF驅動程序將爲您組合這兩個表達式,從而在RDBMS端產生一個查詢。

另一種替代方法,以共享該表達式將被創建基於返回IQueryable<InteractionProgram>預濾波關於可用性EF上下文擴展方法:

public static IQueryable<InteractionProgram> AvailableInteractionPrograms(this MyDbContext dbCtx) => 
    dbXtx.InteractionPrograms.Where(i => 
     i.Eligibility.ProgramType == InteractionProgramTypes.Available 
    ); 

這隱藏的共享方法背後的功能。

+1

我很好奇 - 爲什麼它必須是靜態的? – Chris

+2

@Chris因爲它不使用實例中的任何內容。基本上,表達式有一個額外的「元間接」級別 - 而不是直接在「this」實例上運行,它會產生一個操作(一個函數),它可以在您選擇傳遞給它的任何實例上進行操作。但是,在這種情況下,根本不會傳遞實例。相反,EF驅動程序會將功能分開,並使用其內容來構建SQL條件。 – dasblinkenlight

+0

你說什麼對我來說是有道理的,爲什麼它可以是靜態的,我仍然不確定我明白它爲什麼必須是靜態的。編譯器實際給出了什麼錯誤我沒有測試環境來測試我自己... – Chris