Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 16456|Válasz: 0

[ASP.NET] Magyarázd el a Linq szövetséges lekérdezési tábla eredményhalmazának visszatérését

[Linket másol]
Közzétéve 2015. 05. 08. 16:34:23 | | |

Ebben a cikkben a szerző részletesen bemutatja a Linq közös lekérdezést, mert attól tartok, az olvasók nem értik ezt a szempontot, ezért mielőtt a Linq közös lekérdezésről beszélnénk, először néhány tudást adok neked, majd arról, hogyan valósítják meg a Linq közös lekérdezést, remélve, hogy segíthetek neked.

Először is értsük meg a Linq közös lekérdezés néhány tudáspontját.

1. Névtelen kézbesítési típus



statikus void Main(string[] args)   
{ var Felhasználó = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(User.UserName);      
}         
statikus objektum GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      visszatérő felhasználó;     
}
Amikor definiálunk egy anonim típust, az csak az objektum típuson keresztül adható át, és a fordító nem ismeri az anonim típus tényleges típusát a váltás után.

Ez a vonal a Cast extension módszerrel is elönthető. Az alábbiakban a Cast módszer prototípusa látható.



nyilvános statikus T Cast (ez az objektum o, T t)      
{            
   return ();         
}
2. Hogyan lehet anonim típuslistát generálni a Linq szövetségi lekérdezéshez?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = új lista< ?>();
Az elv ugyanaz, mint a fentiek.



var User = new   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
listát. Add(User);            
Console.Write(list[0]. UserName);
Nézzük meg a MakeList() módszert:



public static List MakeList (this T t) {            
    return new List();      
}
Természetesen azt gondolhatod, hogy a fenti módszer nem elég tökéletes, ezért szükséged van egy felhasználót a listára, így a következő módszer van:      



nyilvános statikus lista MakeList (ez a T t, paraméterek T[] tételek)         
{            
   visszaadja az új listát (tárgyakat);   
}  
Hívásakor így írható:



var User = new   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(User);         
Console.Write(list[0]. UserName);   
Ezúttal térjünk a lényegre, és értsük meg, hogyan valósítják meg a Linq szövetséges lekérdezését.



var q = p-től a db-ben. Termékek     
ahol p.Supplier.Country == "USA" && p.UnitsInStock == 0   
válassz p;
A fenti lekérdezés két kapcsolódó táblázatból áll, és csak egy tábla tartalma kerül vissza, ebben az esetben egy erősen típusozott lista is vissza lehet adni az adatrétegben. Például:



nyilvános lista SelectProducts()   
{ var q = p-től a db-ben. Termékek     
       ahol p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       válassz p;        
       return q.ToList;   
}
Ha a visszaadott eredményhalmaz több mint két tábla, hogyan kell átadni? Biztosan gondoltad, hogy ha az eredményhalmaz egyetlen adatsorból áll, akkor az előbb említett névtelen kézbesítési típussal megkapjuk a szükséges eredményeket. Köztárgy



public objektum SelectProducts()  
{ var q = p-től a db-ben. Termékek      
       ahol p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       válassz új {p.UnitsInStock,p.Supplier.Sid};      var result = q.Single();  
       visszaadási eredmény;   
}
Ez az alapelv azonban az, hogy az üzleti logikai rétegnek ismernie kell az adatrétegben található konkrét anonimitási típusokat. Ez a rétegezés kevés jelentőséggel bír. Ez nem az, amit akarunk. Továbbá, az anonim List típus alkalmazása a többsoros adat eredményhalmazának visszaadására szintén megbukott kísérletek után. Ez azt jelenti, hogy a cikk elején szereplő anonimitás átadásának egyik módszere sem működik.

1. módszer: A Linq szövetséges lekérdezés testreszabja azokat az osztályokat, amelyek ugyanazt a struktúrát tartalmazzák, mint a visszaküldési típus



public class CustomQuery      
{ public uint UnitsInStock   
   { get; Szett; }            
  public int Sid   
   { get; Szett; }        
}
Ez akkor oldható meg, ha a lekérdezés eredménye több táblából áll. Mivel ismerned kell, milyen anonimitás típusa visszatér, egy további osztályt is definiálnod kell azon kívül, hogy nem felel meg a többrétegnek. De ez igaz, és erős típusok segítségével visszaadhatja a szükséges eredményeket.

2. módszer: Linq federált lekérdezés System.Func delegációval (Hivatkozás: Var visszaadása egy C# 3.0 metódusból)

Adatréteg:



public IEnumerable GetCustomersWithOrders(Func,
TProjection> vetítés)   
{ visszaküldés az ügyféltől _customers           
     let customerOrders = a rendelésből _orders                                
     hol rend. CustomerID = customer.ID            
     kiválasztani a vetítést (customer, customerOrders);  
}
Üzleti logikai réteg:



var results = GetCustomersWithOrders(  
(vásárló, rendelések) => új   
{ Név = ügyfél. Név               
     OrderCount = parancsok. Count()        
});
Az ilyen módon visszaadott eredmény továbbra is valódi névtelen típus az üzleti logikai rétegben, és közvetlenül használható.

3. módszer: A Linq szövetséges lekérdezések tárolt eljárásokat vagy nézeteket használnak.




Előző:A LINQ tárolt eljárás visszaküldési érték problémáját kapja a tárolt eljárásom
Következő:A Microsoft elhagyta az IE-t, és eltökélte, hogy 220 000 sor kódot készít
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com