Where(p => p.Id > id) - Dasturiy injiniring (EntityFramework 6)

|
Dasturiy injiniring (EntityFramework 6)
|
bet | 33/53 | Sana | 30.11.2023 | Hajmi | 1,39 Mb. | | #108476 |
Bog'liq Dasturiy injiniringWhere(p => p.Id > id) metodi orqali natijani filtrlash DBdan ma’lumotlar olinganidan so’ng, dasturda amalga oshiriladi.
Filtrlarni moslashtirish uchun biz Where metodini quyidagicha amalga oshirishimiz lozim:
db.Phones.Where(p => p.Id > id);
IQueryable ob’ekti:
using (PhoneContext db = new PhoneContext())
{
IQueryable phoneIQuer = db.Phones;
phoneIQuer = phoneIQuer.Where(p => p.Id > id);
}
So’rov quyidagi ko’rinishga ega:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[Company] AS [Company]
FROM [dbo].[Phones] AS [Extent1]
WHERE [Extent1].[Id] >3
Yuqoridagi kodda barcha metodlar qo’shiladi, so’rov optimallashtiriladi va keyingi qadamda DBdan zarur ma’lumot olinadi. Yuqoridagi ikkita ob’ektdan qaysi birini ishlatish lozim? Bu amal qaysi turdagi masala yechilishiga bog‘liq. Agar dasturchiga jadvaldagi barcha ma’lumotlar zarur bo’lsa, katta tezlikka ega bo’lgan IEnumerable ni ishlatish tavsiya etiladi. Agar bizga barcha yozuvlar o’rniga muayyan shartlarni qanoatlantiruvchi natija zarur bo’lsa, IQueryable ni qo’llash maqsadga muvofiq.
AsNoTracking методи
Ma’lumotlar konteksti DBdan ma’lumotlarni olganda, Entity Framework olingan ma’lumotlarni keshga joylashtiradi va ushbu ob’ektlar ustida amalga oshirilgan o’zgartirishlarni SaveChanges() metodi bajarilguncha nazorat qiladi.
Ma’lumotlarni keshga joylashtirmaslik uchun AsNoTracking() metodi qo’llaniladi. Ushbu metod qo’llanilganda so’rovdan qaytarilayotgan qiymat keshlashtirilmaydi. Bu esa Entity Framework ning qaytarilgan natija uchun biror bir qo’shimcha amal bajarilishi lozim emasligi va ularni saqlash uchun qo’shimcha xotira zarur emasligini anglatadi.
AsNoTracking()_metodi_IQueryable'>AsNoTracking() metodi IQueryable ro'yxatga qo’llaniladi:
using (BookContext db = new BookContext())
{
IEnumerable books1 = db.Books.AsNoTracking().ToList();
IEnumerable books2 = db.Books
.Where(b => b.Price > 200)
.AsNoTracking().ToList();
IEnumerable books3 = db.Books
.Include(b => b.Author)
.AsNoTracking().ToList();
}
Quyidagi misolni ko’rib chiqamiz. Bizning bazamizda bir qancha Phones modellari mavjud bo’lsin:
using (PhoneContext db = new PhoneContext())
{
db.Phones.Add(new Phone { Name = "Samsung Galaxy Note" });
db.Phones.Add(new Phone { Name = "iPhone 6" });
db.SaveChanges();
}
Oddiy amallarni bajaramiz:
using (PhoneContext db = new PhoneContext())
{
Phone firstPhone = db.Phones.FirstOrDefault();
firstPhone.Name = "Samsung Galaxy Ace 2";
db.SaveChanges();
List phones = db.Phones.ToList();
}
Biz phones to’plamda birinchi elementning nomi "Samsung Galaxy Ace 2"ekanligiga guvoh bo’lamiz.
Agar biz AsNoTracking ni ishlatganimizda natija boshqa xil bo’lar edi:
using (PhoneContext db = new PhoneContext())
{
Phone firstPhone = db.Phones.AsNoTracking().FirstOrDefault();
firstPhone.Name = "Samsung Galaxy Ace 2";
db.SaveChanges();
List phones = db.Phones.AsNoTracking().ToList();
}
Birinchi elementni olishda AsNoTracking ishlatilganligi sababli, u ma’lumotlar ustida hech qanday amalni bajarmaydi. Shuning uchun db.SaveChanges() metodi chaqirilganda DBda hech qanday o’zgarish amalga oshirilmaydi. Birinchi element esa avvalgidek, "Samsung Galaxy Note"ga teng bo’ladi.
Oddiy so’rov bilan AsNoTracking metodi orqali amalga oshirilgan so’rovlarning bajarilishini taqqoslaganmizda quyidagi natija hosil qilindi.
Bajalishi tezligi bo’yicha taqqoslash:
Xotiraning ishlatilishi bo’yicha taqqoslash:
Ushbu natijalar juda katta hajmdagi ma’lumotlar ustida amal bajarilganda to’g‘ri natija beradi. Qaysi hollarda AsNoTracking metodidan foydalanish zarur? Agar ma’lumotlarni DBdan olib faqat namoyish qilish lozim bo’lsa, ular ustida yangilash, o’zgartirish va o’chirish amallari talab etilmasa, AsNoTracking dan foydalanish maqsadga muvofiq.
Entity Framework da SQL
SQL bilan ishlash
Ko’p hollarda dasturchilar effektiv so’rovlarni LINQ operatorlari va metodlari yordamida amalga oshirish mumkin. Ammo Entity Framework da ushbu sql-so’rovlarni bajarishning o’ziga xos usullari mavjud.
Ushbu sql-so’rovlarni DBda amalga oshirish uchun ma’lumotlar kontekstidagi Database xususiyatidan foydalanish mumkin. Ushbu xususiyat orqali ma’lumotlar bazasi, ulanish haqida ma’lumot olish va DBga turli so’rovlarni amalga oshirish mumkin. Masalan, ulanish satri haqidagi ma’lumotga ega bo’lish uchun:
using (PhoneContext db = new PhoneContext())
{
Console.WriteLine(db.Database.Connection.ConnectionString);
}
So’rovni hosil qilish uchun sql-ifodani parametr sifatida qabul qiluvchi SqlQuery metodini ishlatish lozim. Misol sifatida avvalgi mavzuda ko’rib chiqilgan DBni ko’rib chiqamiz. Bunda quyidagi model va ma’lumotlar kontekstlari tavsiflangan:
class PhoneContext : DbContext
{
public PhoneContext()
: base("DefaultConnection")
{ }
public DbSet Companies { get; set; }
public DbSet Phones { get; set; }
}
public class Company
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection Phones { get; set; }
public Company()
{
Phones = new List();
}
}
public class Phone
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }
public int CompanyId { get; set; }
public Company Company { get; set; }
}
|
| |