質問: query.ProjectTo(_mapper.ConfigurationProvider); ``` projQueryはIQueryableで、 `ITimeLimitedEntity`を実装し`ITimeLimitedEntity`それから、Linqが変換する必要があるのはなぜですか? **AutomapperまたはLinqに、一部のAutomapperの内部DTOエンティティではなく、すでにITimeLimitedEntityである最終的な投影MySimpleEntityに`where`基準を適用するように指示するにはどうすればよいですか?** 更新: 簡単なdotnetfiddleの例をhttps://dotnetfiddle.net/X2RDGnで作成しました。もちろん、インメモリデータベースを使用しているため、問題なく動作します。しかし、私は現実の世界で失敗する問題のある領域についてコメントしました。 更新2:簡略化されたコンソールアプリgist.github.com/progmars/eeec32a533dbd2e1f85e551db1bc53f8を実際のデータベースで作成しました。一般的な方法でアクセスすると、デバッガーは両方の式の本体に完全に一致するものの、Linq式はまだローカルで実行されています。 アップデート3: 一部の人が指摘したように、その理由は、Automapperではなく、Linq-to-entities自体です。したがって、新しいSOの質問に対して、より複雑で再現性の低い新しいケースが作成され、ここで解決されました。
回答: この問題はAutoMapperとは関係ありませんが、インターフェイスメンバーに基づく述語式です。 `Convert`はC#キャストに相当する式であり、ご覧の`dtoMyOriginalEntity` 、エンティティタイプをプロパティを含む*インターフェイスに*キャストしています( `dtoMyOriginalEntity`はラムダ式*パラメーターの*名前です)。 これは、インターフェイスに制約のあるジェネリックメソッドの既知の動作です。解決策は、 `class`制約を追加することです。あなたの例にそれを適用する: ``` public class CriteriaSpecificationForSomeable : ISpecification where T: class, ISomeable // ----------------------------------------------------------------------------^^^ { private Expression> _someCriteria; public CriteriaSpecificationForSomeable() { _someCriteria = e => (e.Some == "Hello"); } public virtual Expression> Criteria { get { return _someCriteria; } } } ``` キャスト( `Convert` )はなくなりました。 ところで、これは最新のEF Core 2.2.6で修正されており、元のコードはそこで動作します(おそらく、古いEF Coreバージョンを使用しています)。しかし、EF6にも同じ問題があったため、一般に、インターフェイス制約のジェネリック型に対して式を作成するときに、その`class`制約を追加する方が安全です。