仮想プロパティ()を持つクラスがありますpublic virtual List<Ingredients>
が、そのデータを取得したくない場合があります。これどうやってするの?私はとについて知って.Include
い.Select
ますが、そうすると、リポジトリ内の多くのコード原因を変更する必要があり、QueryableandServiceレイヤーも返します。
3 に答える
間接的な答え:私はIQueryable
サービスレイヤーで公開しません。(少なくとも)3つの理由:
- ナビゲーションプロパティにアクセスするときのために、コンテキストを存続させる必要があります。
- サービスレイヤーを使用するレイヤーは、データベースに出力されるSQLに大きな影響を与える可能性があります。あなたはあなたのサービスやリポジトリでそれをコントロールしたいと思っています。
- サービスレイヤーの単体テストは非常に困難です。
したがって、アプリケーションで必要なオブジェクトを公開する場合は、特定のシナリオで必要なナビゲーションプロパティがロードされたオブジェクトを提供できますIEnumerable
。たとえば、製品エンティティ(名前など)のメンテナンス機能は、裸の製品のみを取得します(コードが成分にアクセスすることはありません)。材料から製品を構成する関数は、その材料も取得します。サービス/リポジトリメソッドには、必要なものを指定するためのパラメータが必要です。
遅延ナビゲーションプロパティにアクセスしないことを100%保証する場合は、投影されたオブジェクト(またはDTO)をアプリケーションに公開する必要があります。
デフォルトでは、関連するプロパティは返されません。Include()を使用して、関連するプロパティを返すように指定する必要があります。
遅延読み込みを使用している場合、関連するプロパティを明示的にリクエストする必要がないため、これは必ずしも明確ではない場合があります。EFは、リクエスト時に関連するプロパティが必要かどうかを判断し、データベースリクエストに追加します。
これをテストするには、.First()を追加して宣言し、関連するプロパティを持たないオブジェクトが返されることを確認するときに、LINQクエリを強制的に実行します。
編集 関連するプロパティから特定のプロパティのみをロードすることはできません。関連するプロパティをロードすると、そのすべてのプロパティが自動的にロードされます。
クラスSubClass(SomeCompanyから継承)を作成し、必要なプロパティを含めることはできません。これは、プロキシクラス(SomeCompany)に含めることはできません。
たとえば、クラス
SomeCompany
public class SomeCompany
{
public virtual string SomeProperty { get; set; }
public virtual Company MyCompany { get; set; }
}
public class SomeCompanyEx : SomeCompany
{
public string CompanyName { get; set; }
public override Company MyCompany
{
get
{
return this.myCompany;
}
set
{
this.SetProperty(ref this.myCompany, value);
if (value != null)
{
this.CompanyName = value.Name;
}
else
{
this.CompanyName = null;
}
}
}
}
たとえば、リストオブジェクトなどで使用できるクラスSomeCompanyEx ...これで、プログラムで使用できるプロパティCompanyNameができましたが、プロキシクラスでは使用できません。