2017-09-25 10 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クエリに式を追加するにはどうすればいいですか?すでにExpression<Func<InteractionProgram,bool>>を返すようにIsAvailableを変換しているので

+0

'.Compile()'とはどういう意味ですか?結果は? –

+0

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

+0

エラーはSQLによって提供されていますか?またはコンパイル/解釈について? – GGO

答えて

0

、すべてを行う必要が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ドライバは2つの式を結合し、RDBMS側で1つのクエリを生成します。

この式を共有する別の方法は、IQueryable<InteractionProgram>可用性プレ濾過を返すEFコンテキストに拡張メソッドを作成することになる。

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

これは、共有メソッドの背後にある機能を隠します。

+1

私は不思議です - それはなぜ静的でなければならないのですか? – Chris

+2

@Chrisインスタンスからは何も使用しないためです。基本的に、式には "meta indirection"という特別なレベルがあります。 "this"インスタンスを直接操作するのではなく、渡すことを選択したインスタンスに作用する操作(関数)を生成します。しかし、この場合、インスタンスの通過は全くありません。代わりに、EFドライバはその関数を分離し、その内容を使用してSQL条件を構築します。 – dasblinkenlight

+0

なぜあなたは静的にできるのかという点で私には意味がありますが、どうして静的でなければならないのか分かりません。コンパイラが実際にどのようなエラーを出しているのですか?これを自分でテストするためのテスト環境はありません。 – Chris

関連する問題