سلام ،بنده موقع اجرای این کد،با یه ارروری مواجه میشم
راه حلی داره هم از ویو مدل استفاده کنم و هم تاریخ رو به شمسی تبدیل کنم؟
سلام دوست عزیز
قبل از Select باید یه Select دیگه بذارید و فیلدهای جدولتون رو انتخاب کنید بعد ToList کنید بعدش اون Select خودتون رو در ادامه بنویسید مشکلتون حل میشه، به این صورت :
return db.Acoounting.Select(x=> new {
x.ID,
x.StudentID,
// همه فیلدها
})
.ToList()
.Select(a => new AccountingHistoryViewModel()
{
// همه فیلدهای ویو مدل
})
.OrderBy()
.ToList()
موفق باشید
سلام ،دوست عزیز متاسفانه من اشتباهی عکس دادم
خروجی متود IQueryable ریبل هست،و نمی تونم تبدیل به لیست کنم ،این راه حلی داره؟
خواهش میکنم
تا جایی که اطلاع دارم خیر چون امکان translate کردن براش وجود نداره، البته اینو تست کنید ممکنه به اینصورت بشه استفاده کرد :
var result = db.Accounting.Select(a => new AccountingHistoryViewModel()
{
// همه فیلدهای ویو مدل
})
.OrderBy()
.ToList();
return result.AsQueryable();
بجای var میتونید از IEnumerable هم استفاده کنید
حالا سوال اصلی اینجاس دلیل خاصی برای انجام این کار دارید ؟ میشه بفرمایید چرا خروجیتون IQueryable هست ؟
سلام
به نظر میرسه این کد پرفورمنس خوبی برای کد من نداره
من از IQueryableاستفاده می کنم چون توی کد بیهاند فرم ، این کوری رو فیلتر میکنم و در اخر دات تو لیست میزارم
خب اگه دنبال پرفورمنس هستید که اشتباه شما همینجاست ! شما باید توی کنترلر این عملیات فیلتر رو انجام بدید و Tolist کنید بفرستید به View مگر اینکه کار خاصی بخواید انجام بدید که این راه رو انتخاب کرده باشید !
پیشنهاد میکنم با جزئیات بفرمایید دقیقا میخواید چیکارکنید تا بهتر بشه راهنماییتون کرد و راه حل پیشنهاد داد
اخه من از الگوی MVCاستفاده نکردم که کنترل داشته باشم
از repository استفاده کردم .عین این دوره
متاسفانه من این دوره رو ندیدم واسه همین نمیدونم چطوری پیش رفته
اگه از Repository استفاده کردید اصولش اینه که باید برای هر بخش Service های مجزایی داشته باشید
برای این کار Repository شما باید IQuaryable باشه و کل دیتا رو برگردونه و وقتی Repository رو توی Service خودتون inject کردید توی متد های Service خروجی هارو همگی List بذارید، اینطوری بالاترین پرفورمنس و کمترین پیچیدگی رو توی کدهاتون خواهید داشت.
سلام
دوست عزیز الان هم فک کنم کد های من همینطوری هست که شما میگید،بهتره عکس کاملتری از کد ها بفرستم:
تو خط 60 دات تو لیست رو فراخانی کردم بنابرین فقط برای سرچ و پر کردن دیتا گرید ویو فقط یکبار به بانک کوری زدم،الان بیام تو متود دات تو لیست رو فراخانی کنم، انگار تمام اطلاعات رو واکشی کردم ،فقط چند تا رو برداشتم(مثل اینکه فقط یدونه سیب می خوای ،میری کل یخچال میاری )
متاسفانه من ساختار پروژه و لایه بندی هاتون رو نمیدونم به چه صورت هست، بهرحال با این ساختاری که جلو رفتید و من متوجهش شدم باید تغییراتتون توی متد Filter خط 60 رو به این صورت اصلاح کنید :
dgvAccountingHistory.DataSource =
result.ToList()
.Select(a => new AccountingHistoryViewModel()
{
// همه فیلدهای ویو مدل
})
.OrderBy()
.ToList();
یعنی درواقع بعد از ToList کردن دوباره باید فیلدهارو انتساب بدید به ویومدل خودتون و اینجا میتونید تاریخ رو به شمسی تبدیل کنید و درآخر دوباره ToList کنید
و اما درمورد ساختار و الگویی که من گفتم باید به این شیوه عمل بشه :
1. Repository باید توی یه لایه جدا (جایی که مدل شما تعریف شده) مثلا بنام Data یا Model یا ... باشه و فقط به کلاس های اصلی دیتابیس دسترسی داشته باشه و خروجیش IQuerayble از جنس همون جدول باشه نه ویو مدل ! به اینصورت :
public IQUerayble<AccountingHistory> GetAccountinHistory()
{
return db.AccountingHistory;
// بهتره اینجا سلکت کنید و تک تک ستون هارو انتخاب کنید
}
2. باید یه لایه جدا (جایی که ویومدل ها، Extension ها و ...) مصلا بنام Application یا Core یا Base یا ... داشته باشید که داخلش سرویس ها تعریف شده باشن که خروجی اونها یه لیست از جنس ویومدل شما باشه به این صورت :
public List<AccountingHistoryViewModel> GetAccountinHistory(string param, string startDate, ...)
{
var query = db.AccountingRepository.GetAccountinHistory();
// اینجا همه شرط هاتون رو اضافه میکنید
var result =
query .ToList()
.Select(a => new AccountingHistoryViewModel()
{
// همه فیلدهای ویو مدل
})
.ToList()
.OrderBy();
}
در آخر هم کافیه متد سرویستون رو هرجا توی لایه Presentation که بهش نیاز دارید فراخوانی کنید.
نکته : من اسم متدهارو توی Repository و Service شبیه به هم گذاشتم، این سلیقه ای هست اگه گیج میشید اسم هارو متفاوت بزارید که با دیدنش متوجه بشید کدوم مربطو به Repository و کدوم مربوط به Service ها هستن
پیشنهاد میکنم حتما از یه معماری استفاده کنید و پروژتون رو براساس یه اصول و الگو لایه بندی کنید
موفق باشید
ممنون از راهنمایی تون🌸🌸🌸
خواهش میکنم، موفق باشید