1

これは、ここで尋ねた質問の続きです。

簡単な要約:変更が最小限の 2 つの異なるデータベースがあり (1 つのテーブルとその外部キーが 1 つのテーブルにありません)、Linq-To-Sql を使用するインポート ユーティリティで、重複することなく両方のデータベースにデータを入力できるようにしたいと考えています。ロジック。

私の最初のアプローチは、dynamic2 つの異なるデータベース コンテキストを 1 つの変数に格納することでしたが、このアプローチは機能せず、この目的のためにインターフェイスを使用することをお勧めしました。

今、私は次の問題にぶつかりました:

db コンテキスト クラスからインターフェイスを正しく抽出しました。

public interface IDataContext
{
    System.Data.Linq.Table<IFieldCollection> FieldCollections { get; }
    System.Data.Linq.Table<IField> Fields { get; }
}

...しかし、2 つの異なるデータベース コンテキスト クラスによってインターフェイスを実装できるようにするために、実際の LINQ クラス ( FieldCollectionField) もインターフェイスに置き換える必要がありました。

Table<IFieldCollection>現在、Table<IField>クラスの実装で問題が発生しています。db コンテキスト クラスの自動生成コードは次のとおりです。

    public System.Data.Linq.Table<FieldCollection> FieldCollections
    {
        get
        {
            return this.GetTable<FieldCollection>();
        }
    }

したがって、ここで実装IDataContextするには、戻り値を に変更する必要がありますTable<IFieldCollection>データベースから完全なテーブルを取得せずに、プロパティゲッターにキャストTable<FieldCollection>するにはどうすればよいですか?Table<IFieldCollection>

4

1 に答える 1

2

私のtestappでは、次のように動作するようです。

次のようにインターフェイスを定義します。

public interface IDataContext {
    IQueryable<IFieldCollection> FieldCollections { get; }
    IQueryable<IField> Fields { get; }
}

次の実装でデータコンテキストを更新します。

public partial class DataContext1: IDataContext {
    IQueryable<IFieldCollection> IDataContext.FieldCollections { 
        get { return FieldCollections; }
    }
    IQueryable<IField> IDataContext.Fields { 
        get { return Fields; }
    }
}

たとえば、 を使用してクエリを.Where(<predicate>).FirstOrDefault()実行すると、SQL の対応する WHERE を使用して、クエリが正しくコンパイルされます。

using (IDataContext context = MyDataContextFactory.GetInstance() /* or something else */) {
    var fieldsCount = context.Fields.Where(x => x.Id == 1).Count();
    // The predicate Id == 1 and Count() are translated to sql
}
于 2013-05-24T10:01:15.023 に答える