Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 16456|Odpověď: 0

[ASP.NET] Vysvětlete návrat výsledné sady federované dotazovací tabulky Linq

[Kopírovat odkaz]
Zveřejněno 08.05.2015 16:34:23 | | |

V tomto článku autor podrobně představuje společný dotaz Linq, protože se obávám, že čtenáři tomuto aspektu příliš nerozumí, takže než se pustím do společného dotazu Linq, nejprve vám představím nějaké znalosti a poté popíšu, jak je Linq společný dotaz implementován, s nadějí, že vám pomůžu.

Nejprve si pojďme porozumět některým znalostním bodům společného dotazu Linq.

1. Anonymní typ doručení



static void Main (string[] args)   
{ var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(User.Username);      
}         
statický objekt GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      return User;     
}
Když definujeme anonymní typ, může být předán pouze přes typ objektu a kompilátor po předání nezná skutečný typ anonymního typu.

Tuto linku lze odlévat metodou Cast extension. Níže je prototyp metody Cast.



public static T Cast (tento objekt o, T t)      
{            
   return ();         
}
2. Jak vytvořit anonymní seznam typů pro federovaný dotaz Linq?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = nový seznam< ?>();
Princip je stejný jako výše.



var User = nový   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
seznam. add(uživatel);            
Console.Write(list[0]. UserName);
Podívejme se na metodu MakeList():



public static List MakeList(this T t) {            
    vrátit nový Seznam();      
}
Samozřejmě si možná myslíte, že výše uvedená metoda není dostatečně dokonalá, a že je potřeba přidat uživatele do Seznamu, takže máte následující metodu:      



veřejný statický seznam MakeList (tento T,parametry T[] položky)         
{            
   vrátit nový seznam (položky);   
}  
Při volání lze zapsat jako:



var User = nový   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(User);         
Console.Write(list[0]. UserName);   
Tentokrát se pojďme podívat k věci a pochopit, jak je federovaný dotaz Linq implementován.



var q = z p v db. Produkty     
kde p.Supplier.Country == "USA" & p.UnitsInStock == 0   
Vyberte p;
Výše uvedený dotaz jsou dvě související tabulky, přičemž se vrací pouze obsah jedné tabulky, v tomto případě lze v datové vrstvě vrátit silně typovaný Seznam. Například:



public List SelectProducts()   
{ var q = z p v db. Produkty     
       kde p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       Vyberte p;        
       vrátit q.ToList;   
}
Pokud je vrácená výsledná sada více než dvě tabulky, jak by měla být předána? Museli jste si myslet, že pokud je výsledná sada vrácená pouze jedna řádka dat, můžeme použít anonymní typ doručení, o kterém jsme mluvili dříve, abychom získali požadované výsledky. Veřejný objekt



veřejný objekt SelectProducts()  
{ var q = z p v db. Produkty      
       kde p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       vyberte nové {p.UnitsInStock,p.Supplier.Sid};      var výsledek = q.Single();  
       Výsledek vrátit;   
}
Tato premisa však spočívá v tom, že vrstva obchodní logiky musí znát konkrétní typy anonymity v datové vrstvě. Toto vrstvení nemá velký význam. Tohle není to, co chceme. Navíc metoda použití anonymního typu List pro vrácení výsledků víceřádkových dat také selhala po experimentech. To znamená, že ani jedna ze dvou metod předávání anonymity na začátku tohoto článku nebude fungovat.

Metoda 1: Linkqův federovaný dotaz přizpůsobuje třídy se stejnou strukturou jako return typ



veřejná třída CustomQuery      
{ public uint UnitsInStock   
   { get; set; }            
  public int Sid   
   { get; set; }        
}
To lze vyřešit, když jsou výsledky dotazu množinou výsledků složené z více tabulek. Protože potřebujete znát typ anonymity, kterou vracíte, musíte definovat další třídu kromě toho, abyste nesplňovali multivrstvu. Ale to je pravda a může to vrátit potřebné výsledky pomocí silných typů.

Metoda 2: Linq federovaný dotaz pomocí delegace System.Func (Reference: Vrácení var z metody v C# 3.0)

Datová vrstva:



public IEnumerable GetCustomersWithOrders(Func,
TProjection> projekce)   
{ návrat od zákazníka v _customers           
     nechť customerOrders = z objednávky v _orders                                
     kde řád. CustomerID = customer.ID            
     vyberte projekci(zákazník, zákazníceObjednávky);  
}
Vrstva obchodní logiky:



var results = GetCustomersWithOrders(  
(zákazník, objednávky) => nové   
{ Jméno = zákazník. Jméno               
     OrderCount = řády. Count()        
});
Výsledek vrácený tímto způsobem je stále skutečným anonymním typem v obchodní logické vrstvě a lze jej použít přímo.

Metoda 3: Linkqovy federované dotazy používají uložené procedury nebo pohledy.




Předchozí:LINQ získá problém s vrácením uložené procedury
Další:Microsoft opustil IE a byl odhodlaný vytvořit 220 000 řádků kódu
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com