24

問題は次のとおりです。

参加したい2つのデータコンテキストがあります。LINQでは、あるコンテキストから別のコンテキストへの結合が許可されていないことがわかりました。また、2つの可能な解決策は、単一のデータコンテキストを作成するか、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();
    }
}
4

3 に答える 3

16

たぶん、このようなことで、正しい方向に進むことができます。列名に基づいて同様の列を持つ模擬データベースを作成し、いくつかの結果を得ました。

    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();
    }
}

お役に立てれば!

于 2009-05-22T15:40:05.703 に答える
3

これが私たちが見つけた「回避策」です...

他のデータベースから手動でテーブルを作成し、同じサーバー上にある場合は、テーブル名に次のプレフィックスを付けました。

<DatabaseName>.<SchemaName>.<YourTableName>

それらがリンクサーバー上にある場合は、サーバー名もプレフィックスとして付ける必要があります。

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

これにより、結合を実行しても、実行されていない IQueryable を返すことができます...これが私たちが望んでいたことです。他の 2 つの方法では、インメモリ IEnumerables を結合します。これは、結合 (上記) を実行する前にそれぞれのすべてのレコードを取得し、contains メソッドを使用して IQueryable 結合を実行することを意味しますが、制限があります...

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

于 2009-05-22T16:23:47.260 に答える
0

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

于 2009-05-22T15:27:24.267 に答える