簡體   English   中英

將表達式與linq查詢一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM