模擬交叉上下文連接 - LINQ / C#

c# datacontext entity-framework linq

這是問題所在:

我有2個數據上下文,我想加入。現在我知道LINQ不允許從一個上下文到另一個上下文的連接,我知道2個可能的解決方案是創建單個datacontext或者有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 ...這是我們想要的。其他兩種方法涉及加入內存IEnumerables,這意味著你在進行連接之前拉出所有記錄(上面)並使用包含有限制的contains方法進行IQueryable連接...

希望將來DataContext能夠足夠智能地構建,以便知道如果服務器已鏈接,那麼您可以在兩個不同的服務器之間進行連接。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因