Utilizzare LINQ per creare una query

 

Data di pubblicazione: gennaio 2017

Si applica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Il provider di query .NET Language Integrated Query (LINQ) in Microsoft Dynamics 365 (online e locale) utilizza la sintassi standard di LINQ. Il primo passaggio per la creazione di una query LINQ consiste nell'identificare i tipi di entità rilevanti e le relazioni tra essi esistenti. È possibile specificare l'origine dati e gli altri parametri della query.

La clausola from viene utilizzata per restituire una singola entità "principale". Il provider di query può restituire solo entità di un unico tipo. Le clausole select e orderby devono fare riferimento a questa entità principale. È utilizzare le clausole join per aggiungere le entità con una relazione all'entità "principale".

In questo argomento

Operatori LINQ

Limitazioni di LINQ

Filtraggio con più entità

Operatori LINQ

Tutte le espressioni di query LINQ hanno un formato simile. Nella tabella seguente sono mostrate le clausole più comuni di un'espressione di query LINQ quando si utilizza il provider di query LINQ di Microsoft Dynamics 365.

Operatore LINQ

Descrizione

Esempio

Ottiene un'origine dati (clausola from )

Quando si utilizza il contesto generato e l'associazione anticipata del servizio, utilizzare il set di entità IQueryable, ad esempio AccountSet, nel contesto generato.

Quando non si utilizza il contesto generato, il metodo CreateQuery sull'oggetto di contesto di servizio dell'organizzazione consente di accedere alle entità di Microsoft Dynamics 365.

Utilizzo del contesto generato di servizio:

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

Utilizzo del metodo CreateQuery:

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

Clausola join

La clausola join rappresenta un inner join. Utilizzare la clausola per utilizzare due o più entità che è possibile unire tramite join con un valore dell'attributo comune.

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

Filtro (la clausola where)

La clausola where applica un filtro ai risultati, spesso utilizzando un'espressione booleana. Il filtro specifica gli elementi da escludere dalla sequenza di origine. Ogni clausola where può contenere solo le condizioni per un singolo tipo di entità. Una condizione composta che include più entità non è valida. Ogni entità deve invece essere filtrata in clausole separate where.

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

orderby

L'operatore orderby inserisce gli attributi della query restituiti in un ordine specificato.

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

Clausola select

La clausola select definisce il modulo dei dati restituiti. La clausola crea un set di colonne in base ai risultati dell'espressione della query. È inoltre possibile definire un'istanza di un nuovo oggetto da utilizzare. L'oggetto appena creato mediante la clausola select non viene creato nel server, ma è un'istanza locale.

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

Limitazioni di LINQ

Il provider di query LINQ supporta un sottoinsieme degli operatori LINQ. Non tutte le condizioni che possono essere espresse in LINQ sono supportate. Nella tabella seguente vengono descritte alcune limitazioni relative agli operatori LINQ di base.

Operatore LINQ

Limitazioni

join

Rappresenta un inner o un outer join. Solo i left outer join sono supportati.

from

Supporta una clausola from per query.

where

La parte sinistra della clausola deve essere un nome di attributo, mentre la parte destra deve essere un valore. Non è possibile impostare la parte sinistra su una costante. Entrambi i lati della clausola non possono essere costanti.

Supporta le funzioni Contains, StartsWith, EndsWith e EqualsString.

groupBy

Non supportato. FetchXML supporta le opzioni di gruppo che non sono disponibili con il provider di query LINQ.Ulteriori informazioni: Utilizzare l'aggregazione FetchXML

orderBy

Supporta l'ordinamento in base agli attributi di entità, come Contact.FullName.

select

Supporta i tipi, i costruttori e gli inizializzatori anonimi.

last

L'operatore last non è supportato.

skip e take

Supporta skip e take utilizzando il paging lato server. Il valore skip deve essere maggiore o uguale al valore take.

aggregate

Non supportato. FetchXML supporta le opzioni di aggregazione che non sono disponibili con il provider di query LINQ.Ulteriori informazioni: Utilizzare l'aggregazione FetchXML

Filtraggio con più entità

È possibile creare query complesse .NET Language Integrated Query (LINQ) in Microsoft Dynamics 365 e in Microsoft Dynamics 365 (online). Utilizzare più clausole Join con le clausole di filtro per creare un risultato che venga filtrato in base agli attributi di diverse entità.

Il seguente esempio mostra come creare una query LINQ eseguita con due entità e che filtra il risultato in base ai valori di ciascuna entità.


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

Vedere anche

Esempio: Creare una query LINQ
Esempio: query LINQ complesse
Creare query con LINQ (.NET language-integrated query)
Utilizzare la classe entità con associazione tardiva con una query LINQ
Blog: Driver LINQPad 4 per l'API Web/REST Dynamics CRM disponibili su CodePlex

Microsoft Dynamics 365

© 2017 Microsoft. Tutti i diritti sono riservati. Copyright