Kreuzkontext-Joins simulieren - LINQ / C #

c# datacontext entity-framework linq

Frage

Hier ist das Problem:

Ich habe zwei Datenkontexte, zu denen ich gerne beitreten möchte. Jetzt weiß ich, dass LINQ keine Verknüpfungen von einem Kontext zu einem anderen zulässt, und ich weiß, dass zwei mögliche Lösungen darin bestehen, entweder einen einzelnen Datenkontext zu erstellen oder zwei separate Abfragen zu haben (was ich gerade mache). Was ich jedoch gerne machen möchte, ist, einen Join zu "simulieren".

Folgendes habe ich versucht.

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

In Laufzeit bekomme ich das

System.InvalidOperationException: Die Abfrage enthält Verweise auf Elemente, die in einem anderen Datenkontext definiert sind

BEARBEITEN:

Arbeitslösung:

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

Akzeptierte Antwort

Vielleicht kann so etwas in die richtige Richtung gehen. Ich habe eine Mock-Datenbank mit ähnlichen Spalten basierend auf Ihren Spaltennamen erstellt und einige Ergebnisse erhalten.

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

Hoffe das hilft!


Beliebte Antwort

Dies ist das "Work around", das wir gefunden haben ...

Wir haben unsere Tabellen aus der anderen Datenbank manuell erstellt und wenn sie sich auf demselben Server befinden, haben wir dem Tabellennamen folgendes vorangestellt:

<DatabaseName>.<SchemaName>.<YourTableName>

Wenn sie sich auf einem Verbindungsserver befinden, müssen Sie auch den Servernamen voranstellen:

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

Auf diese Weise können Sie Joins ausführen und trotzdem ein nicht ausgeführtes IQueryable zurückgeben. Dies ist das, was wir wollten. Die anderen zwei Möglichkeiten umfassen das Verknüpfen von In-Memory-IEnumerables, d. H., Sie ziehen alle Datensätze vor dem Join (siehe oben) und führen einen IQueryable-Join mit einer Containermethode durch, die Einschränkungen aufweist.

Hoffentlich wird der DataContext in der Zukunft intelligent genug sein, um zu wissen, dass Sie, wenn die Server verbunden sind, Verknüpfungen zwischen zwei verschiedenen herstellen können.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum