質問

このDbSetからIsSoftDeletedアイテムをフィルタリングするにはどうすればよいですか? ジェネラコディセタグプレ

方法 ジェネラコディセタグプレ

モデル ジェネラコディセタグプレ

編集:WhateverBaseEntityから派生していることを示すのを忘れた

役に立ちましたか?

解決

WhateverクラスにはIsSoftDeletedプロパティがないため、フィルタリングするものはありません。 BaseEntityから派生したものは何でも仮定します。

主な問題は、IQueryable です。実際には存在しません。これは拡張メソッドであり、拡張メソッドは動的型ではうまく機能しません。コンパイラがIQueryable を実装する型を確認できる場合は、var.Where(...)と入力して、コンパイラにSystem.Linq.Queryable.Where(var、...)に解決させることができます。この例では型が動的であるため、コンパイラはIQueryableが実装されていることを認識せず、Whereを呼び出そうとするとエラーを報告します。

DbSetをIQueryable にキャストし(Typeに基本クラスとしてBaseEntityがある場合)、その上で任意のフィルターを呼び出すことができます。実際にダイナミックタイプ機能を使用していますか?そうでない場合は、カスタムSet関数を削除し、デフォルトのDbContext.Set関数を使用することも検討できます。 ジェネラコディセタグプレ

注:これは、dbContext.Set(type).Cast ()の使用と同じではありません :DbSet とDbSet は互換性がありません。これを行うことができるのは、IQueryableおよび「out」タイプの引数を持つ他のインターフェースでのみです。

他のヒント

問題は、Set(Type type)が非ジェネリックのDbSetを返すことです。フィルタを適用するには、フィルタを一般的なIQueryable<T>にキャストする必要があります: ジェネラコディセタグプレ

これは、typeBaseEntityまたはBaseEntity自体から派生している場合にのみ機能します。それ以外の場合は、ランタイム例外が発生します。

結果のsetIQueryable<BaseEntity>型であるため、問題は、この結果がどの程度有用であり、Where(w => w.Name == "abc")などの派生エンティティにさらにフィルターを適用する方法です。少なくとも、set型のdynamicを作成してもコンパイル可能なコードを取得できませんでした。また、強い型付けをすべて失いたくありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top