|
|
Yayınlandı 8.05.2015 16:34:23
|
|
|

Bu makalede yazar Linq ortak sorgusunu ayrıntılı olarak tanıtıyor, çünkü okuyucuların bu yönü çok iyi anlamamasından korkuyorum, bu yüzden Linq ortak sorgudan bahsetmeden önce size biraz bilgi vereceğim, ardından Linq ortak sorgusunun nasıl uygulandığından bahsedeceğim, size yardımcı olmayı umuyorum.
Öncelikle, Linq ortak sorgusunun bazı bilgi noktalarını anlayalım.
1. Anonim teslimat türü
statik boşluk Ana (dize[] args) { var Kullanıcı = GetAnonymous(). Cast(yeni { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } statik nesne GetAnonymous() { var Kullanıcı = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; return Kullanıcı;
} Anonim bir tip tanımladığımızda, bu tip yalnızca nesne tipinden geçebilir ve derleyici, geçişten sonra anonim tipin gerçek tipini bilmeyecektir.
Bu çizgi, Döküm uzatma yöntemiyle dökülebilir. Aşağıda Döküm yönteminin bir prototipi yer almaktadır.
public statik T Cast (bu nesne o, T t) { return ();
} 2. Linq federated sorgusu için anonim bir tür listesi nasıl oluşturulur?
var Kullanıcı = GetAnonymous(). Cast(yeni { UserName = "", LastLoginIp = "" }); var list = yeni List< ?>(); İlke yukarıdakiyle aynıdır.
var Kullanıcı = yeni { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); liste. Add(User); Console.Write(list[0]. UserName); MakeList() yöntemine bir göz atalım:
public static List MakeList (this T t) { return new List();
} Elbette, yukarıdaki yöntemin yeterince kusursuz olmadığını düşünebilirsiniz ve Listeye bir Kullanıcı eklemeniz gerekir, böylece aşağıdaki yönteme sahip olursunuz:
public statik List MakeList (bu T t,paramlar T[] öğeler) { yeni Liste (öğeler) geri döndürür; } Çağrıldığında şu şekilde yazılabilir:
var Kullanıcı = yeni { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. UserName); Bu sefer, Linq federasyon sorgusunun nasıl uygulandığını anlayalım.
var q = db'deki p'den. Ürünler burada p.Tedarikçi.Ülke == "ABD" && p.UnitsInStock == 0 P'yi seçin; Yukarıdaki sorgu, iki ilgili tablodur ve yalnızca bir tablonun içeriği döner; bu durumda, veri katmanında güçlü tipli bir Liste döndürülebilir. Örneğin:
Halka Açık Liste SelectProducts() { var q = db'deki p'den. Ürünler burada p.Tedarikçi.Ülke == "ABD" && p.UnitsInStock == 0 P'yi seçin; return q.ToList;
} Eğer geri dönen sonuç kümesi iki tablodan fazlaysa, nasıl geçirilmeli? Eğer sonuç seti tek bir veri satırı ise, daha önce bahsettiğimiz anonim teslimat türünü kullanarak ihtiyacımız olan sonuçları elde edebileceğimizi düşünmüş olmalısınız. Kamusal nesne
public nesne SelectProducts() { var q = db'deki p'den. Ürünler burada p.Tedarikçi.Ülke == "ABD" && p.UnitsInStock == 0 yeni {p.UnitsInStock,p.Supplier.Sid} seçin; var result = q.Single(); geri dönüş sonucu;
} Ancak bu varsayım, iş mantığı katmanının veri katmanındaki belirli anonimlik türlerini bilmesi gerektiğidir. Bu katmanlama pek önemli değil. İstediğimiz bu değil. Ayrıca, çok satırlı veri sonuç setini döndürmek için anonim List tipini kullanma yöntemi de deneylerden sonra başarısız olmuştur. Bu, makalenin başındaki anonimlik geçişi için kullanılan iki yöntemin hiçbiri işe yaramayacağı anlamına gelir.
Yöntem 1: Linq federated sorgu, dönüş tipiyle aynı yapıya sahip sınıfları özelleştirir
public class CustomQuery { public uint UnitsInStock { al; set; } public int Sid { al; set; }
} Bu, sorgu sonuçları birden fazla tablodan oluşan bir sonuç kümesi olduğunda çözülebilir. Geri dönen anonimlik türünü bilmeniz gerektiğinden, çok katmanlı ile uyumsuz olmanın yanı sıra ek bir sınıf tanımlamanız gerekir. Ama bu doğrudur ve güçlü tipler kullanarak ihtiyacımız olan sonuçları verebilir.
Yöntem 2: System.Func delegasyonu kullanarak Linq federe sorgu (Referans: C# 3.0'daki bir metoddan var döndürülmesi)
Veri Katmanı:
public IEnumerable GetCustomersWithOrders(Func, TProjection> projeksiyon) { müşteriden _customers let customerOrders = _orders içindeki siparişten Nerede düzen. CustomerID = customer.ID projeksiyon (müşteri, customerOrders) seç;
} İş mantığı katmanı:
var results = GetCustomersWithOrders( (müşteri, siparişler) => yeni { İsim = müşteri. İsim, OrderCount = siparişler. Count() }); Bu şekilde geri dönen sonuç, iş mantığı katmanında gerçek bir anonim tiptir ve doğrudan kullanılabilir.
Yöntem 3: Linq federasyona dayalı sorgular depolanmış prosedürler veya görünümler kullanır. |
Önceki:LINQ, saklanan prosedür dönüş değeri sorununu alıyor, benim saklanan prosedürümÖnümüzdeki:Microsoft, IE'yi terk etti ve 220.000 satır kod yapmaya kararlıydı
|