2009-05-22 17 views
16

问题出在这里:模拟交叉上下文联接 - LINQ/C#

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

回答

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。 – 2009-05-22 16:09:49

+0

这种方法的一个潜在问题是您没有进行纯粹的连接,因此如果您需要从贷款上下文中添加另一个连接,您将无法从我所能看到的内容中获得。 – 2009-05-22 16:14:25

0

我赞成创建一个单独的数据上下文,其中包含ns只是你想加入的两张表。但我想你可以在第二个上下文中维护一个临时表(包含来自第一个上下文的数据),然后加入临时表。

+0

创建一个独立的datacontext只需要两个表是可能的,但这不是一个孤立的需求,它只是一个需要此解决方案的单个示例。我希望避免每次需要满足此需求时创建一个独立的数据上下文。 – 2009-05-22 16:12:05

3

这是“解决”我们已经找到了......

我们建立我们的表从出手动其他数据库,如果是在同一台服务器上,然后我们前缀表名:

<DatabaseName>.<SchemaName>.<YourTableName> 

,如果他们是一个链接的服务器上,那么你必须与服务器名称的前缀一样好:

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

这将允许你做连接和仍返回一个非执行我可查询...这是我们想要的。其他两种方式涉及加入内存中的IEnumerables,这意味着您在进行连接之前为每个连接拉上所有记录(上图),并使用包含方法进行IQueryable连接,这种连接具有局限性...

希望在未来DataContext将被构建得足够聪明,知道如果服务器被链接,那么你可以在两个不同的连接之间进行连接。