問題は次のとおりです。
結合したい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つの方法では、メモリ内のIEnumerablesを結合します。つまり、結合を実行する前にそれぞれのすべてのレコードをプルし(上記)、制限のあるcontainsメソッドを使用してIQueryable結合を実行します。
将来的には、DataContextが十分にスマートに構築され、サーバーがリンクされている場合は、2つの異なるサーバー間で結合を実行できることがわかります。
結合したい2つのテーブルだけを含む別のデータコンテキストを作成することをお勧めします。ただし、2番目のコンテキストで一時テーブル(最初のコンテキストからのデータを含む)を維持してから、一時テーブルを結合できると思います。