برداشت اطلاعات از دیتابیس با ef core
سلام
داخل برنامه کنسولی که دارم قصد دارم اطلاعات دیتابیسو فقط 10 تای اولو بردارم بعد مثلا 10 تای دومو
حالا سوالی که برام پیش اومده ااینه که داخل ef اگه بخوام این کارو کنم باید اول اطلاعات دیتابیسو بریزم داخل لیست بعد 10 تای اولو بردارم ولی من میخوام فقط 10تای اولو مستقیم از دیتابیس داخل لیست داشته باشم.
از دوستان اگر کسی راهنمایی کنه ممنون میشم.
نقل قول: برداشت اطلاعات از دیتابیس با ef core
سلام دوست عزیز.
شما میتونید از متد.Take و .Skip استفاده کنید :
_db.Products.Take(10).ToList();
_db.Products.Skip(100.Take(10).ToList();
متد اول فقط ده تای اول رو برای شما واکشی میکنه و متد دوم 10 تا رو رد میکنه و 10 تای دوم رو واکشی میکنه.
نقل قول: برداشت اطلاعات از دیتابیس با ef core
لازم نیست به لیست تبدیل کنید. خروجی DbSet از نوع IQueryable هست. به این معنی که یک کوئری هست و شامل داده های خروجی نمیشه. برای دریافت 10 تای اول ابتدا باید مشخص کنید اول بودن بر چه اساسی هست. ابتدا باید داده ها را بر اساس یک فیلدی Order کنید.
public IActionResult GetTopTen()
{
var model = _db.Users
.Select(u => new { u.Givenname, u.Birthday })
.OrderBy(u => u.Birthday).Take(10);
return Ok(model.ToList());
}
وقتی کدر رو اجرا کنید در EF این دستورات تولید میشه :
Executed DbCommand (109ms) [Parameters=[@__p_0='?'], CommandType='Text', CommandTimeout='30']
SELECT "u"."Givenname", "u"."Birthday"
FROM "Users" AS "u"
ORDER BY "u"."Birthday"
LIMIT @__p_0
می بینید که داده ها از طریق دستور Select دریافت میشه و فقط اطلاعاتی که مشخص کردید از دیتابیس استخراج میشه.
بعضی کوئری ها در SQL قابل اجرا نیست و EF اونهارو از دیتابیس خارج میکنه و درون حافظه اجرا میکنه. اینها محدود به موارد خاصی میشه که در SQL Server دستور معادلی براش نیست.
بهتر قبل از استفاده از دادهها اونها رو به لیست تبدیل کنید. از اونجایی که IQueryable فقط کوئری هست و نه خود داده تا زمانی که ازش استفاده نکنید داده ها رو از دیتابیس خارج نمیکنه.
نقل قول: برداشت اطلاعات از دیتابیس با ef core
نقل قول:
نوشته شده توسط
hakim22
لازم نیست به لیست تبدیل کنید. خروجی DbSet از نوع IQueryable هست. به این معنی که یک کوئری هست و شامل داده های خروجی نمیشه. برای دریافت 10 تای اول ابتدا باید مشخص کنید اول بودن بر چه اساسی هست. ابتدا باید داده ها را بر اساس یک فیلدی Order کنید.
public IActionResult GetTopTen()
{
var model = _db.Users
.Select(u => new { u.Givenname, u.Birthday })
.OrderBy(u => u.Birthday).Take(10);
return Ok(model.ToList());
}
وقتی کدر رو اجرا کنید در EF این دستورات تولید میشه :
Executed DbCommand (109ms) [Parameters=[@__p_0='?'], CommandType='Text', CommandTimeout='30']
SELECT "u"."Givenname", "u"."Birthday"
FROM "Users" AS "u"
ORDER BY "u"."Birthday"
LIMIT @__p_0
می بینید که داده ها از طریق دستور Select دریافت میشه و فقط اطلاعاتی که مشخص کردید از دیتابیس استخراج میشه.
بعضی کوئری ها در SQL قابل اجرا نیست و EF اونهارو از دیتابیس خارج میکنه و درون حافظه اجرا میکنه. اینها محدود به موارد خاصی میشه که در SQL Server دستور معادلی براش نیست.
بهتر قبل از استفاده از دادهها اونها رو به لیست تبدیل کنید. از اونجایی که IQueryable فقط کوئری هست و نه خود داده تا زمانی که ازش استفاده نکنید داده ها رو از دیتابیس خارج نمیکنه.
از پاسخی که دادید بسیار سپاسگزارم
فقط سوال دیگه ای داشتم
چطور میتونم درون select شرط بزارم که فقط اسامی که شبیه پارامتر name هست رو انتخاب کنه؟ به عنوان مثال ممکنه من 10کاربر داشته باشم که اسمشون علی باشه...
10 تای اول از دیتابیس که نامشان علی است یعنی دیتابیس دیگه سراغ بقیه علی ها نره
ولی آیا بعدش میشه 10 تای دومو صدا زد؟
نقل قول: برداشت اطلاعات از دیتابیس با ef core
برای شرط باید از Where استفاده کنید. برای رد کردن باید از Skip استفاده کنید.
برای مشاهده ی 10 تا 10تا باید مقدار Skip رو مشخص کنید. برای 10 تای اول صفر و برای 10 تای دوم 10 و برای ده تای سوم 20 و ...
public IActionResult GetTopTen(int skipCount,int takeCount)
{
var model = _db.Users
.Select(u => new { u.Givenname, u.Birthday })
.Where(u=>u.Givenname=="Ali")
.OrderBy(u => u.Birthday).Skip(skipCount).Take(takeCount);
return Ok(model.ToList());
}
نقل قول: برداشت اطلاعات از دیتابیس با ef core
میتونید برای Paging و یک سری اعمال دیگه مثل Sorting, Searching از Sieve استفاده کنید.