私は VS2010 .Net4 Linq-to-EntityFramework を使用しており、子データを明示的に熱心にロードしたいと考えています。Linq-to-SQL IIUC では使用できますが、Linq-to-EF では使用できないDataLoadOptionsまたはLoadWithと同様の機能を提供したいと考えています。
(余談ですが、これは後でテスト中に再生するデータを記録できるようにするためです。遅延読み込みを使用しており、これらの発生を見つけて熱心な読み込みに置き換える必要があります。DataLoadOptionsメソッドを使用すると、これを実装するクリーンな方法が可能になります。 .)
MosesOfEgypt ブログで説明されているように、タイプセーフな熱心な読み込みスキームを提供しようとしています。T4 の世代を変更しましたが、最後の問題だと思います。.Net4 では、エンティティ プロパティはObjectSetを返します。しかし残念なことに、Include関数はObjectSetの基本クラスであるObjectQueryを返します。
以下は、変更された T4 テンプレートから生成された ObjectContext クラスのサブセットです。
#region DataLoadOptions Functionality
public DataLoadOptions LoadOptions { get; set; }
private ObjectSet<TEntity> ApplyDataLoadOptions<TEntity>(string queryString) where TEntity : class
{
var query = CreateObjectSet<TEntity>(queryString);
if (LoadOptions != null)
{
var members = LoadOptions.GetPreloadedMembers<TEntity>();
foreach (var member in members)
{
********** query = query.Include(member.Name);
}
}
return query;
}
#endregion
#region ObjectSet Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Address> Addresses
{
get
{
if ((_Addresses == null))
{
_Addresses = ApplyDataLoadOptions<Address>("Addresses");
}
return _Addresses;
}
}
#endregion
「 * 」で始まる行は、 ObjectQueryからObjectSetへのキャストが行われる場所です。そして、これは無効なアップキャストであるため、設計時に明示的にキャストすると、間違っていない限り、実行時に失敗します。
1 つの解決策は、 ObjectSet.Includeの拡張メソッドを作成して、 ObjectQueryではなくObjectSetを返すようにすることです。可能であれば、 ObjectQuery.Include関数のソース コードを見つける方法を知りたいです。そして、これらのソリューションが機能するかどうかはわかりません。
また、Include関数の結果をObjectQueryからObjectSetにアップキャストする方法があったかどうかも疑問です。繰り返しますが、これが機能するかどうかはわかりません。
.Net4 での Linq-to-EF の DataLoadOptions 機能の実装に関するヘルプをいただければ幸いです。