2016-11-13 8 views
2

私は私のBLLエンティティに私のEFエンティティから再利用可能なマッピング式を作成していますから、式 >を使用して: タイプエラーの任意の()メソッド

private Expression<Func<Person, bool>> GetNameFilter(string name) 
{ 
    return person => person.Profile.UserName == name; 
} 

internal Expression<Func<Ef.Perk, Bll.Perk>> MapPerkPerk(string name) 
{ 
    return perk => new Bll.Perk 
     { 
      Id = perk.PerkId, 
      Name = perk.PerkName, 
      Description = perk.PerkDescription, 

      //Compilation Error 
      Owned = perk.Players.Any(GetNameFilter(name)) 
     }; 
} 

そして、私は指摘でコンパイルエラーを取得していますライン。エラーが読み:

いるICollectionは「どれ」と最高の拡張メソッドのオーバーロード「Queryable.Any(のIQueryable、式>)」の定義が含まれていません「のIQueryable」

タイプの受信機が必要です

しかし、私は直接にこの表現を押すと、この現象が発生しません:

internal Expression<Func<Ef.Perk, Bll.Perk>> MapPerkPerk(string name) 
{ 
    return perk => new Bll.Perk 
     { 
      Id = perk.PerkId, 
      Name = perk.PerkName, 
      Description = perk.PerkDescription, 

      //No Compilation Error 
      Owned = perk.Players.Any(person => person.Profile.UserName == name) 
     }; 
} 

ですが、なぜでしょうか?両方の式の型は同じです。 LinqExpressionソリューションを使用して

私は今、実行時に次のエラーを取得しています、以下のが見つかりました:型「System.InvalidCastExceptionの」の例外がLinqKit.dllで発生した

が、ユーザーコードで処理されなかった

追加情報:タイプ 'System.Linq.Expressions.InstanceMethodCallExpressionN'のオブジェクトを「System.Linq.Expressions.LambdaExpression」と入力することができません。

internal FutureQuery<Perk> GetPlayerInfoPerks(string username) 
{ 
    return Master 
      .Perks 
      .VisiblePerks 
      .Select(Master.Perks.MapPerkPerk(username)) 
      .Future(); 
} 

これはEntityFramework.Futureライブラリを使用するためですか?

+0

、あなたのクラスに'? – Masoud

+0

サードパーティのパッケージを使用することはできますか? –

+0

私はSystem.Linqを使用しています。私は第三者を使わない方が好きですが、DRYに従うことができるのであれば、私は彼らに反対しません。 – jokulmorder

答えて

1

どうしてですか?両方の式の型は同じです。両方の式の

タイプない同じである - 彼らは単に視覚的に同じように見えます。

dbContext.Persons.Any(GetNameFilter(name)) 

、これではありません:以下は有効です

perk.Players.Any(GetNameFilter(name)) 

なぜ?最初はExpression<Func<...>>があり、2番目の場合はFunc<..>(同じ名前のIQueryable<T>IEnumerable<T>メソッドの間の標準的な違い)が予想されるためです。あなたがその違いを見ることを願っています。それを直接入力すると、C#コンパイラはどちらか一方を発行するという魔法を行いますが、手動で行うと、正しいものを使用するはずです。

この問題は、Invoke/Expandカスタム拡張メソッド(さらに一般的にはAsExpandable)のLinqKitパッケージによって解決されます。あなたの具体的な例については

、LinqKitソリューションは、このようなことができます:あなたはSystem.Linqのを使用して `使用してい

using LinqKit; 

... 

internal Expression<Func<Ef.Perk, Bll.Perk>> MapPerkPerk(string name) 
{ 
    // LinqKit requires expressions to be in variables 
    var nameFilter = GetNameFilter(name); 
    return Linq.Expr((Ef.Perk perk) => new Bll.Perk 
    { 
     Id = perk.PerkId, 
     Name = perk.PerkName, 
     Description = perk.PerkDescription, 
     Owned = perk.Players.Any(p => nameFilter.Invoke(p)) 
    }).Expand(); 
} 
+0

単純なFunc で動作させる方法はありますか?それはうまくコンパイルされますが、1025ランタイムエラーが発生します。 – jokulmorder

+0

この設定でもエラーが発生していますが、OPを編集してこのケースを指定します。 – jokulmorder

+0

あなたが書いたものはまったく持っていませんでした。 – jokulmorder

関連する問題