1

この行は、User 型の入力と SoftDeleteEntity 型のチェックを含む 'TypeAs' 式はサポートされていません:

var test = this.partiallyFiltered.Where(additionalFilter).ToList();

これがそこにあるものです。partialFiltered のタイプはIQueriable<User>です。追加のフィルターのタイプは でExpression<Func<User, bool>>、渡される実際の式 (デバッガーによる) は!((x as SoftDeleteEntity).IsDeleted)です。ユーザーは SoftDeleteEntity を継承します。関連する情報が欠落しているとは思いませんが、お知らせいただければ詳しく説明します。どこかで機能しない暗黙のキャストが必要であることは理解していますが、見つかりません。

編集:式の宣言は次のとおりです。すべてのエンティティは IEntity です。

public static Expression<Func<TEntity, bool>> DefaultFilter<TEntity>()
        where TEntity : IEntity
{
   if (typeof(SoftDeleteEntity).IsAssignableFrom(typeof(TEntity)))
      return x => !(x as SoftDeleteEntity).IsDeleted;
   else return x => true;
}
4

2 に答える 2

1

それで、アダムの答えに触発されて、答えを思いつきました。私が思いついた解決策は次のとおりです。

var function = additionalFilter.Compile();
var test = this.partiallyFiltered.Where(x => function(x));

このコードはエンティティ タイプごとに 1 回しか使用されないため、ここでコンパイルしても問題はないようです。これは、他の提案されたソリューションと比較して、面倒ではないソリューションまたは重複が少ないソリューションのように思われるため、他の誰かが私のコードが最も長く機能していた本当の理由を考え出さない限り、2 日以内に受け入れます。動作を停止。このコードは機能しますが、何も説明しません。Adam の説明は、私の静的に定義されたフィルターが以前に機能していたことを除いて完全に理にかなっています。コードが変更されていないことが履歴からわかります。私のモデルだけが変更されました。

編集:アダムスが指摘したように、コンパイルされたフィルターはSQLに変換されず(私が考えていたこと)、ローカルでのみ実行されるため、結局これは答えではありません

于 2013-06-21T20:54:28.960 に答える