Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 16456|Risposta: 0

[ASP.NET] Spiega il ritorno del set di risultati della tabella di query federata Linq

[Copiato link]
Pubblicato su 08/05/2015 16:34:23 | | |

In questo articolo, l'autore introduce in dettaglio la query congiunta di Linq, perché temo che i lettori non comprendano molto bene questo aspetto, quindi prima di parlare della query congiunta di Linq, prima vi offrirò alcune conoscenze e poi parlerò di come viene implementata la query congiunta di Linq, sperando di aiutarvi.

Prima di tutto, comprendiamo alcuni punti di conoscenza della query congiunta di Linq.

1. Tipo di consegna anonima



vuoto statico Main(string[] args)   
{ var User = GetAnonymous(). Cast(nuovo { UserName = "", LastLoginIp = "" });           
   Console.Write(User.UserName);      
}         
oggetto statico GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      restituisci l'Utente;     
}
Quando definiamo un tipo anonimo, può essere passato solo attraverso il tipo oggetto, e il compilatore non conoscerà il tipo effettivo del tipo anonimo dopo il passaggio.

Questa linea può essere trasmessa tramite il metodo di estensione Cast. Di seguito è riportato un prototipo del metodo Cast.



Cast statico pubblico T (questo oggetto o, T t)      
{            
   ritorno ();         
}
2. Come generare una lista di tipi anonima per la query federata di Linq?        



var User = GetAnonymous(). Cast(nuovo { UserName = "", LastLoginIp = "" });         
var list = nuova Lista< ?>();
Il principio è lo stesso di quanto sopra.



var User = nuovo   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
lista. Aggiungi (Utente);            
Console.Write(list[0]. UserName);
Diamo un'occhiata al metodo MakeList():



public static List MakeList(this T t) {            
    ritorno nuova Lista();      
}
Ovviamente, potresti pensare che il metodo sopra descritto non sia abbastanza perfetto e che tu debba aggiungere un Utente alla lista, quindi hai il seguente metodo:      



pubblica statica Lista MakeList (questo T t, params T[] elementi)         
{            
   restituire nuova Lista(elementi);   
}  
Quando chiamato, può essere scritto come:



var User = nuovo   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(User);         
Console.Write(list[0]. UserName);   
Questa volta, andiamo al punto e comprendiamo come viene implementata la query federata di Linq.



var q = da p in db. Prodotti     
dove p.Supplier.Country == "USA" & p.UnitsInStock == 0   
seleziona p;
La query sopra è composta da due tabelle correlate, e solo il contenuto di una tabella viene restituito; in questo caso, una Lista fortemente tipata può essere restituita nel livello dati. Per esempio:



Lista pubblica SelectProducts()   
{ var q = da p in db. Prodotti     
       dove p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       seleziona p;        
       ritorno q.ToList;   
}
Se il set di risultati restituito è più di due tabelle, come dovrebbe essere approvato? Avrai pensato che se il set di risultati restituito è una singola riga di dati, possiamo usare il tipo di consegna anonima che abbiamo menzionato prima per ottenere i risultati di cui abbiamo bisogno. Oggetto pubblico



oggetto pubblico SelectProducts()  
{ var q = da p in db. Prodotti      
       dove p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       seleziona un nuovo {p.UnitsInStock,p.Supplier.Sid};      risultato var = q.Single();  
       risultato di ritorno;   
}
Tuttavia, questa premessa è che il livello di logica aziendale deve conoscere i tipi specifici di tipi di anonimato nel livello dati. Questa stratificazione ha poca importanza. Non è questo che vogliamo. Inoltre, il metodo di utilizzare il tipo anonimo List per restituire il set di risultati di dati multi-riga fallì anche dopo gli esperimenti. Questo significa che nessuno dei due metodi per passare l'anonimato all'inizio di questo articolo funzionerà.

Metodo 1: Linq federated query personalizza le classi con la stessa struttura del tipo di ritorno



classe pubblica CustomQuery      
{ uint pubblico UnitsInStock   
   { get; set; }            
  public int Sid   
   { get; set; }        
}
Questo può essere risolto quando i risultati della query sono un insieme di risultati di più tabelle. Poiché devi sapere che tipo di anonimato viene restituito, devi definire una classe aggiuntiva oltre a non conformarsi al multilayer. Ma questo è vero e può restituire i risultati di cui abbiamo bisogno usando tipi forti.

Metodo 2: Query federata Linq usando delega System.Func (Reference: Ritorno var da un metodo in C# 3.0)

Livello dati:



pubblici IEnumeri GetCustomersWithOrder(Func,
TProjezione> proiezione)   
{ reso dal cliente a _customers           
     lascia customerOrders = da ordine in _orders                                
     dove l'ordine. CustomerID = customer.ID            
     proiezione selezionata (cliente, clientiOrdini);  
}
Livello di logica aziendale:



risultati var = GetCustomersWithOrders(  
(cliente, ordini) => nuovo   
{ Nome = cliente. Nome,               
     OrderCount = ordini. Count()        
});
Il risultato restituito in questo modo è ancora un vero tipo anonimo nel livello di logica aziendale e può essere usato direttamente.

Metodo 3: Le query federate di Linq utilizzano stored procedure o view.




Precedente:LINQ ha un problema di ritorno di valore nella stored procedure la mia stored procedure
Prossimo:Microsoft abbandonò IE ed era determinata a realizzare 220.000 righe di codice
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com