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. |