-1

私はこれに取り組むための最良の方法が何であるかを理解しようとしています。2つの異なるデータベースにCustomerテーブルがあります(理想的ではありませんが、変更することはできません。与えられたものを使用する必要があります)。レコードは同期され、いくつかのフィールド(CustomerId、CustomerNameなど)を共有します。しかし、それぞれに独自のフィールドがあります...たとえば、次のようになります。

Database1のお客様

  • 顧客ID
  • 顧客名
  • フィールド1
  • フィールド2

Database2のお客様

  • 顧客ID
  • 顧客名
  • DifferentField1
  • DifferntField2

各データベースには独自のdbContextがあり、そこから各Customerオブジェクトを個別にプルできます。しかし、私が本当に望んでいるのは、両方のデータベースのすべてのフィールドの結合を含む単一の統合されたCustomerオブジェクトです。

単一の統合オブジェクトを公開できるように、これを実現するための最良の方法は何でしょうか。

編集:私はDbSetを使用しており、次のように、コンテキストオブジェクト内の各エンティティのマッピングを指定しています。

public DbSet<Customer> Customers { get; set; }

そして、私のマッピングクラスには典型的なマッピング情報があります。

this.ToTable("Customer");
this.HasKey(t => t.CustomerId);
this.Property(t => t.CustomerName);

などなので、このロジックを複数のテーブル/データベースで拡張し、クエリだけでなく、必要なすべてのCRUD操作を実行できるようにする方法を探しています。

ありがとう

4

3 に答える 3

4

必要なのは、統合オブジェクトを表すクラスを宣言することだけです。

public class UnifiedCustomer
{
    public int CustomerId {get; set;}
    public string Name {get; set;}
    public int Field1 {get; set;}
    public int Field2 {get; set;}
    public int DifferentField1 {get; set;}
    public int DifferentField2 {get; set;}
}

このタイプは、両方のデータベースからのデータを表すために使用されます。

var customers1 = dataContext1.Customers.Select(c => new UnifiedCustomer
{
    CustomerId = c.CustomerId,
    Name = c.CustomerName,
    Field1 = c.Field1,
    Field2 = c.Field2
});
var cusomers2 = dataContext2.Customers.Select(c => new UnifiedCustomer
{
    CustomerId = c.CustomerId,
    Name = c.CustomerName,
    DifferentField1 = c.DifferentField1,
    DifferentField2 = c.DifferentField2
});

同じタイプの両方のコレクションを使用すると、結合を実行できます。

var all = customers1.Union(customers2);
于 2012-05-17T17:41:58.880 に答える
1

単一の統合オブジェクトを公開できるように、これを実現するための最良の方法は何でしょうか。

おそらく、各コンテキストから適切な結果を取得してから、LINQ to Objectsを使用して、メモリ内の結果セットに対して「結合」を実行する必要があります。

于 2012-05-17T17:11:36.313 に答える
0

2つのデータベースが同じクラスにマップされている場合は、次のように簡単に実行できます。

        using (var cx1 = new customerEntities(firstDbConnectionString))
        {
            using (var cx2 = new customerEntities(secondDbConnectionString))
            {
                return cx1.tCustomer.ToList().AddRange(cx2.tCustomer.ToList());
            }
        }
于 2012-05-17T17:31:59.080 に答える