tgoop.com/fullStackDevs/591
Create:
Last Update:
Last Update:
#LINQ
❇️ 5 usefull tips to write cleaner LINQ code
🔹در این پست قصد داریم چند توصیه در هنگام نوشتن کوئری های Linq به شما دهیم که باعث خوانا تر شدن کوئری ها میشود.
🔸کوئری های linq علاوه بر ساده بودن زیبایی خاصی نیز دارند و بدون شک در صورتی که به درستی نوشته شود پرفورمنس بالایی هم دارند.
برای پرهیز کردن از اشتباهات احتمالی در هنگام نوشتن کوئری های linq باید قوانینی را برای خود مشخص کنید و بدین ترتیب بروز باگ و خطاهای احتمالی کاهش میابد.
در ادامه پنج نوع از این قوانین را معرفی میکنیم.
1️⃣ Two chained methods
هنگامی که کوئری ای مینویسید که فقط دارای دو Linq متد است و کوئری تان به یک eager linq متد ختم می شود. میتوانید کل کوئری خود را در یک خط قرار دهید.
var userList = GetDataSource().Where(p => p.Email.Contains("@foo.com")).ToList();در غیر اینصورت کوئری خود را در چند خط بنویسید.
var userList = GetDataSource()▫️اگه در مورد eager linq متدها اطلاعاتی محدودی دارید این مقاله را مطالعه نمایید.
.Where(p => p.Email.Contains("@foo.com"))
.Select(s => s.Email);
2️⃣ اگر کوئری تان بیش از دو متد دارد باز هم هر متد را در خط جدیدی قرار دهید.
3️⃣ Don’t iterate IQueryable<T> by using keyword foreach.
🔹در این قانون شما را با اصلی آشنا میکنیم با عنوان
💎 “explicit is better than implicit”.
🔸در هنگام بررسی کدها و حتی خواندن کدهای دیگران اگر جایی از کد بروی یک IQuerable حلقه زده باشید(به وسیله foreach), خوانایی و درک کد کاهش میابد (البته این یک نظر شخصی است) . همچنین ممکن است کسی که کدتان را میخواند این مسئله را فراموش کرده باشد یا نداند که در foreach باعث اجرا شدن این کوئری میشود.
روش بهتر این است که ابتدا کوئری را اجرا کرده و سپس بروی آن حلقه بزنید.
var usersEmailList = GetDataSource()
.Where(p => p.Email.Contains("@foo.com"))
.Select(user => user.Email);
.ToList();
foreach (var user in usersEmailList)
{
...
}
4️⃣ Long Lambda statement is not okay.🔸از طولانی و بزرگ شدن بدنه lambda های درون کوئری تا حد ممکن بپرهیزید در برخی موارد اگر lambda ای چند خط به عنوان بدنه داشته باشد باعث خوانایی کد میشود اما در اکثر مواقع از خوانایی کوئری می کاهد.
someQuery.Select(p => {
var newUser = new User
{
Name = p.Name,
Age = p.Age
}
});
5️⃣ Entity Framework🔸در هنگام کار کردن با EF از این دست قبیل قوانین که غالبا شخصی هستند بسیار وجود دارد به عنوان مثال
فرض کنید نیاز به نوشتن linq کوئری داریم که براساس شروطی, داده هایی رو از دیتابیس واکشی کند و در قسمتی دیگری از کد بروی داده های واکشی شده کارهای دیگری انجام دهیم.(فرایند اجرا شدن این کارها در حافظه انجام میشود و قابل ترجمه به کوئری sql نیستند)
▫️روش اشتباه نوشتن این کوئری بدین صورت است
var usersEmailList = GetSomeDbSet()
.Where(p => p.Email.Contains("@foo.com"))
.Select(user => user.Email)
.ToList()
.Select(SomeTransoformationInMemory);
🔸 بدین منظور باید کوئری خود را به دو بخش تقسیم کرده و عملیاتی را که قابل ترجمه هستند را ابتدا در کوئری که به سمت دیتابیس ارسال میشود, اجرا کنند و بقیه عملیات را بروی داده های واکشی شده انجام دهید.var usersEmailListFromDB = GetSomeDbSet()
.Where(p => p.Email.Contains("@foo.com"))
.Select(user => user.Email)
.ToList();
var usersEmailList = usersEmailListFromDB.Select(SomeTransoformationInMemory).ToList();
@fullStackDevsBY Web Devs

Share with your friend now:
tgoop.com/fullStackDevs/591