模拟交叉上下文联接 – LINQ / C#
这是问题:
我有两个数据上下文,我想要join。 现在我知道LINQ不允许从一个上下文连接到另一个上下文,而且我知道2个可能的解决scheme是创build单个数据上下文或者有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:查询包含对在不同数据上下文中定义的项目的引用
编辑:
工作scheme:
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(); } }
希望这可以帮助!
这是我们find的“解决方法”…
我们从另一个数据库手动构build表,如果它位于同一台服务器上,则我们在表名前加上:
<DatabaseName>.<SchemaName>.<YourTableName>
如果它们位于链接的服务器上,则还必须在服务器名称前加上前缀:
<ServerName>.<DatabaseName>.<SchemaName>.<YourTableName>
这将允许你做连接,并返回一个非执行的IQueryable …这就是我们想要的。 另外两种方式涉及到连接内存中的IEnumerables,这意味着你在每次连接(上面)之前拉取所有logging,并使用contains方法进行IQueryable连接。
希望将来DataContext将被构build得足够聪明,知道如果服务器被链接,那么你可以在两个不同的连接之间进行连接。
我喜欢创build一个单独的数据上下文,其中只包含您要join的两个表。 但是我想你可以在第二个上下文中维护一个临时表(包含来自第一个上下文的数据),然后join临时表。