2009-05-22 16 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將被構建得足夠聰明,知道如果服務器被鏈接,那麼你可以在兩個不同的連接之間進行連接。