PDA

View Full Version : برداشت اطلاعات از دیتابیس با ef core



alirezaavini
چهارشنبه 23 آبان 1397, 08:49 صبح
سلام
داخل برنامه کنسولی که دارم قصد دارم اطلاعات دیتابیسو فقط 10 تای اولو بردارم بعد مثلا 10 تای دومو
حالا سوالی که برام پیش اومده ااینه که داخل ef اگه بخوام این کارو کنم باید اول اطلاعات دیتابیسو بریزم داخل لیست بعد 10 تای اولو بردارم ولی من میخوام فقط 10تای اولو مستقیم از دیتابیس داخل لیست داشته باشم.
از دوستان اگر کسی راهنمایی کنه ممنون میشم.

EnKamran
چهارشنبه 23 آبان 1397, 11:29 صبح
سلام دوست عزیز.
شما میتونید از متد.Take و .Skip استفاده کنید :
_db.Products.Take(10).ToList();
_db.Products.Skip(100.Take(10).ToList();
متد اول فقط ده تای اول رو برای شما واکشی میکنه و متد دوم 10 تا رو رد میکنه و 10 تای دوم رو واکشی میکنه.

hakim22
چهارشنبه 23 آبان 1397, 11:45 صبح
لازم نیست به لیست تبدیل کنید. خروجی 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 فقط کوئری هست و نه خود داده تا زمانی که ازش استفاده نکنید داده ها رو از دیتابیس خارج نمیکنه.

alirezaavini
چهارشنبه 23 آبان 1397, 13:05 عصر
لازم نیست به لیست تبدیل کنید. خروجی 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 تای دومو صدا زد؟

hakim22
چهارشنبه 23 آبان 1397, 21:38 عصر
برای شرط باید از 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());
}

Moien Tajik
پنج شنبه 24 آبان 1397, 10:47 صبح
میتونید برای Paging و یک سری اعمال دیگه مثل Sorting, Searching از Sieve (https://github.com/Biarity/Sieve) استفاده کنید.