Freigeben über


Verwenden von LINQ zum Erstellen einerAbfrage

 

Veröffentlicht: Januar 2017

Gilt für: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Der .NET Language-Integrated Query (LINQ)-Abfragenanbieter in Microsoft Dynamics 365 (online und lokal) verwendet Standard-LINQ-Syntax. Der erste Schritt zum Erstellen einer LINQ-Abfrage besteht darin, die relevanten Entitätstypen und die Beziehungen zwischen diesen zu identifizieren. Sie können dann die Datenquelle und die anderen Abfrageparameter angeben.

Die from-Klausel wird verwendet, um eine einzelne „Stamm“-Entität zurückzugeben. Der Abfragenanbieter kann nur Entitäten eines einzigen Entitätstyps zurückgeben.orderby und select-Klauseln müssen auf diese Stammentität verweisen. Mit join-Klauseln können Sie Entitäten einer Beziehung zur „Stamm“-Entität hinzuzufügen.

In diesem Thema

LINQ-Operatoren

LINQ-Einschränkungen

Filtern mehrerer Entitäten

LINQ-Operatoren

Alle LINQ-Abfrageausdrücke haben ein ähnliches Format. In der folgenden Tabelle sind die häufigsten Klauseln in einem LINQ-Abfrageausdruck aufgeführt, wenn der LINQ-Abfragenanbieter von Microsoft Dynamics 365 verwendet wird.

LINQ-Operator

Beschreibung

Beispiel

Abrufen einer Datenquelle (die from-Klausel)

Wenn Sie den generierten Dienstkontext und ältere Bindung verwenden, verwenden Sie den Entitätssatz, wie z. B. IQueryableAccountSet, im generierten Kontext.

Wenn Sie keinen generierten Kontext verwenden, können Sie mit der CreateQuery-Methode im Servicekontext der Organisation auf Microsoft Dynamics 365 zugreifen.

Verwenden des generierten Servicekontexts:

var query1 = from c in context.ContactSet
select c;

Verwenden der CreateQuery-Methode:

var query1 = from c in context.CreateQuery<Contact>()
select c;

join-Klausel

Die join-Klausel stellt eine innere Verknüpfung dar. Verwenden Sie die Klausel, um mit zwei oder mehreren Entitäten zu arbeiten, die mit einem gemeinsamen Attributwert verknüpft werden können.

from c in context.ContactSet
join a in context.AccountSet on c.ContactId equals a.PrimaryContactId.Id

Filtern (die where-Klausel)

Die where-Klausel wendet einen Filter auf die Ergebnisse an. Dazu wird häufig ein Boolescher Ausdruck verwendet. Der Filter gibt an, welche Elemente von der Quellreihenfolge auszuschließen sind. Jede where-Klausel kann nur Bedingungen für einen einzelnen Entitätstyp enthalten. Eine zusammengesetzte Bedingung, die mehrere Entitäten mit einbezieht, ist ungültig. Stattdessen sollte jede Entität in separaten where-Klauseln gefiltert werden.

from a in context.AccountSet
where (a.Name.StartsWith("Contoso") && a.Address1_StateOrProvince == "WA")

orderby

Der orderby-Operator stellt die zurückgegebenen Abfragenattribute in eine bestimmte Reihenfolge.

var query1 = from c in context.CreateQuery<Contact>()   
    orderby c.FullName ascending   
    select c;
foreach ( var q in query1)   
{
    Console.WriteLine(q.FirstName + " " + q.LastName);   
}

select-Klausel

Die select-Klausel definiert die Form der zurückgegebenen Daten. Die Klausel erstellt einen Spaltensatz auf der Grundlage der Abfrageausdruckergebnisse. Sie können auch eine Instanz eines neuen Objekts definieren, mit dem gearbeitet werden soll. Das neu mit der select-Klausel erstellte Objekt wird nicht auf dem Server erstellt, sondern ist eine lokale Instanz.

select new Contact   
{
    ContactId = c.ContactId,
    FirstName = c.FirstName,
    LastName = c.LastName,
    Address1_Telephone1 = c.Address1_Telephone1   
};

LINQ-Einschränkungen

Der LINQ-Abfragenanbieter unterstützt eine Teilmenge der LINQ-Operatoren. Nicht alle Bedingungen, die in LINQ ausgedrückt werden können, werden unterstützt. In der folgenden Tabelle sind einige Einschränkungen für die grundlegenden LINQ-Operatoren aufgeführt.

LINQ-Operator

Einschränkungen

join

Stellt eine innere oder äußere Verknüpfung dar. Nur linke äußere Verknüpfungen werden unterstützt.

from

Unterstützt eine einzige from-Klausel pro Abfrage.

where

Auf der linken Seite der Klausel muss ein Attributname und auf der rechten Seite der Klausel muss ein Wert stehen. Sie können die linke Seite nicht auf eine Konstante festlegen. Es dürfen keine Konstanten auf beiden Klauselseiten stehen.

Unterstützt die String-Funktionen Contains, StartsWith, EndsWith und Equals.

groupBy

Nicht unterstützt. FetchXML unterstützt das Gruppieren von Optionen, die nicht mithilfe des LINQ-Abfragenanbieter verfügbar sind.Weitere Informationen: FetchXML-Aggregation verwenden

orderBy

Unterstützt die Sortierung nach Entitätsattributen, wie Contact.FullName.

select

Unterstützt anonyme Typen, Konstruktoren und Initialisierer.

last

Der last-Operator wird nicht unterstützt.

skip und take

Unterstützt skip und take mit serverseitigem Paging. Der Wert skip muss größer oder gleich dem Wert take sein.

aggregate

Nicht unterstützt. FetchXML unterstützt die Aggregation von Optionen, die nicht mithilfe des LINQ-Abfragenanbieter verfügbar sind.Weitere Informationen: FetchXML-Aggregation verwenden

Filtern mehrerer Entitäten

Sie können komplexe .NET Language-Integrated Query (LINQ)-Abfragen in Microsoft Dynamics 365 und Microsoft Dynamics 365 (online) erstellen. Sie können mehrere Join-Klauseln mit Filterklauseln verwenden, um ein Ergebnis zu erhalten, das nach Attributen aus mehreren Entitäten gefiltert ist.

Das folgende Beispiel zeigt, wie Sie eine LINQ-Abfrage erstellen, die mit zwei Entitäten arbeitet und das Ergebnis anhand von Werten aus den einzelnen Entitäten filtert.


using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
{
 var query_where3 = from c in svcContext.ContactSet
                    join a in svcContext.AccountSet
                    on c.ContactId equals a.PrimaryContactId.Id
                    where a.Name.Contains("Contoso")
                    where c.LastName.Contains("Smith")
                    select new
                    {
                     account_name = a.Name,
                     contact_name = c.LastName
                    };

 foreach (var c in query_where3)
 {
  System.Console.WriteLine("acct: " +
   c.account_name +
   "\t\t\t" +
   "contact: " +
   c.contact_name);
 }
}

Using svcContext As New ServiceContext(_serviceProxy)
 Dim query_where3 = From c In svcContext.ContactSet _
                    Join a In svcContext.AccountSet _
                    On c.ContactId Equals a.account_primary_contact.Id _
                    Where a.Name.Contains("Contoso") _
                    Where c.LastName.Contains("Smith") _
                    Select New With {Key .account_name = a.Name,
                                     Key .contact_name = c.LastName}

 For Each c In query_where3
  Console.WriteLine("acct: " &amp; c.account_name &amp; vbTab &amp; vbTab _
                    &amp; vbTab &amp; "contact: " &amp; c.contact_name)
 Next c
End Using

Siehe auch

Beispiel: Erstellen einer LINQ-Abfrage
Beispiel: Komplexe LINQ-Abfragen
Erstellen von Abfragen mit LINQ (.NET language-integrated query)
Verwenden von spät gebundenen Entitätsklassen mit einer LINQ-Abfrage
Blog: LINQPad 4 Driver für Dynamics CRM REST/Web API sind verfügbar auf CodePlex

Microsoft Dynamics 365

© 2017 Microsoft. Alle Rechte vorbehalten. Copyright