Left Outer Joins via Linq To Entities über Entity Framework mit Where-Klausel

Ich habe alle posts gelesen bezüglich der Umsetzung der äquivalent zu einem LEFT OUTER JOIN in Linq to Entities - (.NET 3.5) bei der Verwendung des Entity Framework, haben aber noch eine Lösung zu finden für Folgendes problem.

Gegeben zwei Tabellen, vertreten durch die Objekte unter:

    public class Foo
    {
        public int FooId;  //primary key
        public string Name;
    }

    public class Bar
    {
        public int BarId;  //primary key
        public int FooId;  //foreign key
        public string Desc;
    }

Brauche ich zum erstellen eines Linq to Entities-Anweisung ENTSPRICHT der folgenden SQL-Anweisung. Beachten Sie, dass die WHERE-Anweisung enthält zwei ODER würd Bedingungen, die span beiden Tabellen, und die Verwendung des DISTINCT-qualifier.

SELECT DISTINCT
    Foo.*
FROM
    Foo
    LEFT OUTER JOIN Bar ON Foo.FooId = Bar.FooId
WHERE
    (Foo.Name = 'fooname' OR Bar.Desc = 'bardesc')

Wird die Linq-Abfrage, die ich bin, zu generieren, ist Linq to Entities über Entity Framework, und wird (hoffentlich) generieren Sie eine einzelne SQL-Anweisung zur Ausführung an den server. Linq to Entities nicht unterstützt FirstOrDefault() extension-Klausel, also die standard-Linq-syntax für LINKS-OUTER-JOINs werden nicht funktionieren.

Hier ist die Lösung, die ich habe, SO WEIT, aber ich bin nicht in der Lage zu tun, eine der folgenden:

1) Generieren eines ResultSet enthält das set der Foo/Bar Kombinationen, die würde zurückgegeben werden, die von der LEFT-OUTER-JOIN-operation.

2) Umsetzung entspricht der WHERE-Klausel: WHERE (Foo.Name = 'fooname' OR Bar.Desc = 'bardesc')

    private class JoinSet
    {
        public Foo Foo;
        public IQueryable<Bar> Bars;
    };

    private class FooBar
    {
        public Foo Foo;
        public Bar Bar;
    };

    IEnumerable<Foo> OuterJoinTest()
    {
        IQueryable<Foo> fooBaseQuery = dbContext.FooSet;
        IQueryable<Bar> barBaseQuery = dbDontext.BarSet;

        IQueryable<JoinSet> joinQuery =
            from foo in fooBaseQuery
            select new JoinSet
                    {
                        Foo = foo,
                        Bars = barBaseQuery.Where(bar => bar.FooId == foo.FooId)
                    };

        //How do I generate a result set containing FooBar objects ?

        //How or where do I insert the equivalent of: ?
        // WHERE (Foo.Name = 'fooname' OR Bar.Description = 'bardesc')

        IQueryable<Foo> resultQuery =
            from joinSet in joinQuery
            select joinSet.Foo;

        resultQuery = resultQuery.Distinct();

        return resultQuery.ToList();
    }

Jede Hilfe, Vorschläge oder Ideen würde geschätzt.

EulerOperator

Schreibe einen Kommentar