[英]Using an expression with a linq query
目前,我有一個linq查詢,其中包含一個駐留在其中的方法。 我收到錯誤LINQ to Entities does not recognize the method
。 因此,我發現可以將方法轉換為表達式LINQ到Entities不能識別該方法,但是我想知道是否有一種干凈便捷的方法將表達式添加到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查詢中。
由於您已經將IsAvailable
轉換為返回Expression<Func<InteractionProgram,bool>>
,所以您要做的就是將調用此方法的結果傳遞給IQueryable<T>
的Where
方法:
var res = ctx.InteractionPrograms.Where(InteractionProgram.IsAvailable());
請注意,為了對此進行編譯,您的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 <= endDate呢? 那會去哪里?
其他條件在IsAvailable
條件之前或之后立即進入單獨的Where
子句。 EF驅動程序將為您組合這兩個表達式,從而在RDBMS端產生一個查詢。
共享此表達式的另一種方法是在EF上下文上創建擴展方法,該方法返回為可用性進行了預過濾的IQueryable<InteractionProgram>
:
public static IQueryable<InteractionProgram> AvailableInteractionPrograms(this MyDbContext dbCtx) =>
dbXtx.InteractionPrograms.Where(i =>
i.Eligibility.ProgramType == InteractionProgramTypes.Available
);
這會將函數隱藏在共享方法的后面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.