キーと値のペアのストアであるデータベースにテーブルがあり、値フィールドに格納されているデータのタイプに関するタイプ情報があります。
型指定されていないデータ プロバイダーの作成に関するブログ シリーズを読み、odata からサンプルを取得していじりましたが、バッキング ストアとしてインメモリ ディクショナリを使用するサンプルを使用する方法がわかりません。データの実際のストアとして、EF または Linq to Sql エンティティのいずれか。
キーと値のペアのストアであるデータベースにテーブルがあり、値フィールドに格納されているデータのタイプに関するタイプ情報があります。
型指定されていないデータ プロバイダーの作成に関するブログ シリーズを読み、odata からサンプルを取得していじりましたが、バッキング ストアとしてインメモリ ディクショナリを使用するサンプルを使用する方法がわかりません。データの実際のストアとして、EF または Linq to Sql エンティティのいずれか。
あなたが求めていることはかなり難しいです。サンプルがディクショナリを使用する理由は、カスタムLINQプロバイダー(IQueryable実装)の記述を避けるためです。あなたの場合、それはあなたがする必要があることのほとんどです。さらに、エンティティがテーブルの行であり、プロパティがそのテーブルの列である統計データモデルを想定しているため、EFもLINQ to SQLも機能しないようです(大まかに言えば)。それはあなたには当てはまらないようです。私が正しく理解していれば、モデルのプロパティごとに行があります。これを機能させるには、少なくとも部分的にIQueryableを実装し、データ構造を理解させる必要があります。たとえば、フィルタリングは異なります。通常、Nameプロパティの単純なフィルターは、DBでWHERE Name='...'として表すことができます。しかし、あなたの場合、これはおそらく結合に変換され、名前のある行のキー/値テーブルを検索して、その値を比較する必要があります。上記で提案したアプローチを使用して、すべてをメモリにロードすることができます。コーディングはかなり簡単ですが、すべてをメモリにロードします。または、カスタムLINQプロバイダーを作成してみてください。これはとても難しいです。しかし、それを試してみたい場合は、LINQtoSQLのようなものを実装する方法を基本的に説明しているこのブログシリーズをご覧になることをお勧めします。http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx 私はあなたの典型的な表現を説明するシリーズを書いていますプロバイダーは、WCFDataServicesと連携するためにサポートする必要があります。これも便利です: http: //blogs.msdn.com/b/vitek/archive/2010/02/25/data-services-expressions-part-1-intro.aspx 書き込みのみが可能であることに注意してくださいプロバイダーの一部を自分で。たとえば、自分でフィルタリングを処理し、複雑な射影/拡張をLINQtoObjectsに任せることができます。このアプローチにより、プロバイダーの実装が少し簡単になります。
わかりました、これが私がこれまでに持っているものです。唯一の問題は、すべてのクエリをメモリ内で実行する必要があることです。
public IList<DSPResource> GetResourceSetEntities(string resourceSetName) {
List<DSPResource> entities;
if (!this.resourceSetsStorage.TryGetValue(resourceSetName, out entities)) {
entities = new List<DSPResource>();
var resourceType = _metaData.ResourceSets.Single(r => r.Name == resourceSetName).ResourceType;
var query = from v in _db.ChannelValues.GroupBy(x => x.ItemSetId)
select new DSPResource(resourceType,v.Key.Value, v);
entities.AddRange(query.ToList());
this.resourceSetsStorage[resourceSetName] = entities;
}
return entities;
}