クロスコンテキスト結合のシミュレーション - LINQ / C#

c# datacontext entity-framework linq

質問

問題は次のとおりです。

参加したい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();
    }
}

受け入れられた回答

たぶん、このようなことであなたは正しい方向に始められるでしょう。私はあなたの列名に基づいて同様の列を持つモックデータベースを作り、いくつかの結果を得ました。

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

お役に立てれば!


人気のある回答

これは私たちが発見した「回避策」です...

他のデータベースから手動でテーブルを作成し、それが同じサーバー上にある場合は、テーブル名の前に次のように付けます。

<DatabaseName>.<SchemaName>.<YourTableName>

それらがリンクサーバー上にある場合は、サーバー名を接頭辞として付ける必要があります。

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

これにより、結合を実行しても実行されていないIQueryableを返すことができます。他の2つの方法は、メモリ内のIEnumerableを結合することです。これは、結合を実行する前に各レコードをすべて取得し、制限のあるcontainsメソッドを使用してIQueryable結合を実行することを意味します。

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



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ