2009-05-22 6 views
16

ここに問題があります:クロスコンテキストジョインのシミュレート - LINQ/C#

私はジョインをしたい2つのデータコンテキストを持っています。 LINQは1つのコンテキストから別のコンテキストへの結合を許可していないことを知っています.2つの可能な解決策は、単一のdatacontextを作成するか、2つの別個のクエリを作成することです(これは私が今行っていることです)。しかし、私がしたいのは、結合を "シミュレート"することです。

ここで私が試したことがあります。私が取得、実行時に

using (var _baseDataContext = Instance) 
{ 
    var query = from a in _baseDataContext.Account.ACCOUNTs 
       where a.STR_ACCOUNT_NUMBER.ToString() == accountID 
       join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals 
          app.GUID_ACCOUNT 
       join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION 
       select l.GUID_LOAN; 

    return query.Count() > 0 ? query.First() : Guid.Empty; 
} 

private static IQueryable<LOAN> GetLoans() 
{ 
    using (var _baseDataContext = Instance) 
    { 
     return (from l in _baseDataContext.Loan.LOANs 
       select l).AsQueryable(); 
    } 
} 

System.InvalidOperationExceptionがある:

作業溶液:

using (var _baseDataContext = Instance) 
{ 
    var query = from a in _baseDataContext.Account.ACCOUNTs 
       where a.STR_ACCOUNT_NUMBER.ToString() == accountID 
       join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals 
          app.GUID_ACCOUNT 
       join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION 
       select l.GUID_LOAN; 

    return (query.Count() > 0) ? query.First() : Guid.Empty; 
} 

private static IEnumerable<LOAN> GetLoans() 
{ 
    using (var _baseDataContext = Instance) 
    { 
     return (from l in _baseDataContext.Loan.LOANs 
       select l).AsQueryable(); 
    } 
} 
クエリが異なるデータコンテキストに

EDITを定義したアイテムへの参照が含まれています

答えて

12

多分このような何かが正しい方向に始めることができます。私はあなたの列名に基づいて同様の列を持つモックデータベースを作って、いくつかの結果を得ました。

class Program 
{ 
    static AccountContextDataContext aContext = new AccountContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True"); 
    static LoanContextDataContext lContext = new LoanContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True"); 

    static void Main() 
    { 

     var query = from a in aContext.ACCOUNTs 
        join app in aContext.APPLICATIONs on a.GUID_ACCOUNT_ID equals app.GUID_ACCOUNT 
        where app.GUID_APPLICATION.ToString() == "24551D72-D4C2-428B-84BA-5837A25D8CF6" 
        select GetLoans(app.GUID_APPLICATION); 

     IEnumerable<LOAN> loan = query.First(); 
     foreach (LOAN enumerable in loan) 
     { 
      Console.WriteLine(enumerable.GUID_LOAN); 
     } 

     Console.ReadLine(); 
    } 

    private static IEnumerable<LOAN> GetLoans(Guid applicationGuid) 
    { 
     return (from l in lContext.LOANs where l.GUID_APPLICATION == applicationGuid select l).AsQueryable(); 
    } 
} 

+0

以前はIEnumerable を返そうとしましたが、予期したとおりにキャストエラーが発生しました。しかし、私はIEnuerableを返すことを考えなかった。 AsQueryable。 –

+0

このアプローチの1つの潜在的な問題は、純粋な結合を行っていないということです。したがって、私が見ることができないほどの融資コンテキストから別の結合を追加する必要がある場合です。 –

+0

これはうまくいきました。 メソッド結合のwhere句を削除することができます。メソッドからの選択を行うのではなく、純粋な結合を行うだけです。ここでのトリックは、メソッドがIEnumerableを返さなければならないことです。 .AsQueryable これにより、クロスコンテキストジョインを行うことができ、これまでのところパフォーマンスヒットは見られません。 –

0

私は別のデータコンテキストを作成することをお勧めしますnsはあなたが結合したい2つのテーブルだけです。しかし、私はあなたが一時的なテーブル(最初のコンテキストからのデータを含む)を2番目のコンテキストで維持し、一時テーブルに参加できると思います。

+0

2つのテーブルだけを必要とする別のdatacontextを作成することは可能ですが、これは分離されたニーズではなく、このソリューションの必要性の単なる一例です。私は、この必要性を満たす必要があるたびに、独立したデータコンテキストを作成しないようにしたいと考えています。 –

3

これは、我々が発見したという「回避」である...

私たちは、手動で他のデータベースから、私たちのテーブルを構築し、それが同じサーバー上にあるならば、我々がテーブル名を接頭辞:

<DatabaseName>.<SchemaName>.<YourTableName> 

彼らはリンクサーバー上にある場合、あなたは同様にサーバー名を前に付けする必要があります。

<ServerName>.<DatabaseName>.<SchemaName>.<YourTableName> 

これが加わり、まだ私は実行以外を返すあなたができるようになりますクエリ可能な...私たちが望むものです。他の2つの方法では、メモリ内のIEnumerablesに参加する必要があります。これは、結合を行う前に(上の)結合を実行する前にすべてのレコードをプルし、制限付きの包含メソッドを使用してIQueryable結合を実行することを意味します...

将来的にはDataContextは、サーバーがリンクされている場合、2つの異なるサーバー間の結合を行うことができることを知るのに十分にスマートに構築されます。

+0

これは良い考えですが、この場合はオプションではありません。しかし、提案していただきありがとうございます。 –

関連する問題