2017-12-13 13 views
-1

に私はこのエラーが出る理由を理解していない: 『スコープから参照した「C#のエンティティLINQの式のエラー

『変数 『』タイプの』C SomeEntity』を、それは」が定義されていません。

これは私が実行しようとしているコードです。 それは私がIsNicePredicateメソッドに渡すパラメータ値c.Idについて不平を言っているようですが、私は理由を理解できないようです。

var result = _dbContext.Set<SomeEntity>().Select(c => new SomeEntityDto 
    { 
     BlahBlah = c.BlahBlah, 
     Hello = _dbContext.Set<Entity>().Where(IsNicePredicate(c.Id)).ToList(), 
     XXX = c.XXX, 
     YYY = c.YYY 
    }); 


    private Expression<Func<Entity, bool>> IsNicePredicate(int collateralId) 
    { 
     Console.WriteLine(); 
     return e => e.AnotherEntity.Any(x => x.Good && x.Bye == collateralId); 
    } 

答えて

0

EFはコードをSQLに変換します。したがって、Selectの本体としてのラムダは直接的には実行されず、むしろ解釈され、翻訳されます。

LINQKitを使用するか、IsNicePredicateの本文を手作業で入れてみる必要があると思います。

私はあなたがそうとしてそれを使用する必要があると思います:

var result = _dbContext.Set<SomeEntity>().AsExpandable().Select(c => new SomeEntityDto 
    { 
     BlahBlah = c.BlahBlah, 
     Hello = _dbContext.Set<Entity>().Where(IsNicePredicate(c.Id)).ToList(), 
     XXX = c.XXX, 
     YYY = c.YYY 
    }); 

あなたが別のクエリをネストされているので、私はあなたが別のAsExpandable()が必要な場合はわからない:

Hello = _dbContext.Set<Entity>().AsExpandable().Where(IsNicePredicate(c.Id)).ToList() 
+0

私はIsNicePredicateメソッドを内部に配置したくありません。私はlinqがどのように動作しているのか分かっていますが、なぜコンテキストが失われているのか分かりません。 – MasterOfPuppets

+0

@ MasterOfPuppets次に、例外スタックトレースを調べる方法も知っていると思います。内部EF表現のビジター実装で予期せぬ(逃した)ケース(バグ?)の結果だと思われます。しかし、それはまったく重要ですか?このように使用することはできません。アンサーアドバイスを受け取り、LINQKit 'AsExpandable' /' Invoke'などを利用する必要があります。 –

+0

少なくともLINQKitのソリューションを提供できますか?私はそのAPIに慣れていません... – MasterOfPuppets

0

あなたが試すことができますこのようなもの?

var result = _dbContext.Set<SomeEntity>() 
    .Select(c => new { c, Hello = _dbContext.Set<Entity>().Where(e => e.AnotherEntity.Any(x => x.Good && x.Bye == c.Id)).ToList() }) 
    .Select(ch => new SomeEntityDto 
    { 
     BlahBlah = ch.c.BlahBlah, 
     Hello = ch.Hello, 
     XXX = ch.c.XXX, 
     YYY = ch.c.YYY 
    }); 
関連する問題