ویرگول
ورودثبت نام
سعید صفایی| Saeed Safaee
سعید صفایی| Saeed SafaeeSenior back-end developer | ProjectManager
سعید صفایی| Saeed Safaee
سعید صفایی| Saeed Safaee
خواندن ۲ دقیقه·۶ سال پیش

بررسی ()ToQueryString. و ()Include. در Core5

یکی از مشکلات EF این بود که دستوراتی که درست میکرد را برنامه نویس نمی توانست ببیند اما...

با استفاده از ()ToQueryString. در Entity Framework Core 5.0 که برای برای پرس و جوهای LINQ ارائه می شود، می توانید کوئری که به برای دیتابیس تولید میکند(T-SQL) را مشاهده کنید.


بررسی یه مثال:

public class Person { [Key] public int ID { get; set; } public string Name { get; set; } public List<PersonChild> Childs { get; set; } public List<PersonAddress> Address { get; set; } }
public class PersonChild { [Key] public int CildID { get; set; } public string ChildName { get; set; } } public class PersonAddress { [Key] public int AddressID { get; set; } public string AddressName { get; set; } }

در بالا کلاس person و Child های آن را ساختیم

با استفاده از دستور زیر می توانیم T-SQL که EF برای ما تولید میکند را ببینیم:

var list= db.Persons.Where(r=> r.ID == 1).Include(i => i.Childs).Include(r => r.Address).ToQueryString(); دستور بالا یک شخص را با فرزندان و آدرس ها باز می گرداند

نتیجه این دستور به شکل کوئری زیر است:

SELECT[p].[ID], [p].[Name], [p0].[CildID], [p0].[ChildName], [p0].[PersonID], [p1].[AddressID], [p1].[AddressName], [p1].[PersonID] FROM[Persons] AS[p] LEFT JOIN[PersonChild] AS[p0] ON[p].[ID] = [p0].[PersonID] LEFT JOIN[PersonAddress] AS[p1] ON[p].[ID] = [p1].[PersonID] WHERE[p].[ID] = 1 ORDER BY[p].[ID], [p0].[CildID], [p1].[AddressID]

این روش مناسبی است چون فقط یک بار به دیتابیس درخواست می دهد، در گذشته برای هر جدول Child و Address یک درخواست جدا ارسال می شد به دیتابیس، اما فقط برای رکورد های کمتر از 10تا، برای رکورد های بیشتر از آن به شدت افت سرعت دارد و بسیار بد است.

برنامه نویسیمهندسی نرم افزارسی شارپ
۱
۰
سعید صفایی| Saeed Safaee
سعید صفایی| Saeed Safaee
Senior back-end developer | ProjectManager
شاید از این پست‌ها خوشتان بیاید