با عرض سلام و خسته نباشید خدمت استاد گرامی.
خواستم بدون چه طوری میتونم لیست محصولات رو اول بر اساس جدید بودن مرتب کنم سپس بر اساس تعداد موجودیت اون به طوری که محصولات ناموجود به انتهای لیست منتقل بشه (مهم نیست جدید ترین محصول هست یا نه.) و محصولات جدید و موجود در ابتدا نمایش داده باشه از OrderByDescendingو ThenByDescending استفاده کردم. مشکلی که داره اینه که محصولات یا بر اساس تعداد مرتب میشه که تاریخ ساخت اون مهم نیست یا بر اساس تاریخ مرتب میشه که تعداد در اون مهم نیست.
به طور خلاصه اول محصولات جدید و موجود نمایش داده بشه و تا قدیمی ترین محصول موجود بره بعد محصولات جدید و نا موجود و تا قدیمی ترین محصول نا موجود نمایش داده بشه.
با سلام ابتدا شرط الزام کنید و سپس نوع چیدمان سفارشی (ضمنا برای برخی ویژگی ها مثلا پر بازدیدترین کالا و محبوب ترین کالا ها شما نیاز دارید که فیلد های جدیدی در طراحی لحاظ کنید) در نهایت این موارد به صورت کد های چند تکی هستن که باید نوشته شوند و از مورد 1 و سپس 2 به لیست نمایشی اطلاعات اضافه گردد.
using DBMain db = new DBMain();
var ls1 = db.Prouducts.Where(c=> c.Count >= 1).OrderByDescending(z=>z.Time).ToList();
var ls2 = db.Prouducts.Where(c=> c.Count == 0).OrderByDescending(z=>z.Time).ToList();
متشکرم. از اونجایی که باید IQuerable ارسال بشه. راهی هست که این کار رو کرد؟ برای یه پروژه وب دارم استفاده میکنم. چون فکر نکنم IQuerable متودهایی مثل AddRange یا موارد مشابه داشته باشه.
آپدیت : مطابق روش شما عمل کردم ولی دیگه ToList رو نزدم. سپس یه لیست جدید ساختم و به وسیله کد زیر اون ها رو به هم متصل کردم.
var all = newP.Contact(oldP);
ولی الان باعث خطای InvalidOperationException میشه. چه طوری این مشکل رو برطرف کنم؟
InvalidOperationException: Unable to translate a collection subquery in a projection since either parent or the subquery doesn't project necessary information required to uniquely identify it and correctly generate results on the client side. This can happen when trying to correlate on keyless entity type. This can also happen for some cases of projection before 'Distinct' or some shapes of grouping key in case of 'GroupBy'. These should either contain all key properties of the entity that the operation is applied on, or only contain simple property access expressions.
نمیدونم چرا همون روش اصلی که از اول نوشته بودم الان درست جواب میده. ابتدا محصولات رو بر اساس موجودی مرتب کردم بعد بر اساس تاریخ ثبت. این طوری همون چیزی شده که من میخوام.
ولی اگه روش مطمئن تری هست ممنون میشم بگید.
آپدیت: زمانی که اطلاعات بیشتری برای تست به جدول استفاده کردم. فعلا همون چیزیه که میخوام ولی محصولات موجود فقط بر اساس موجودی دسته بندی میشه و تاریخ ثبت اون مهم نیست. در تست اول 2 تا محصول داشتم ولی الان که محصول سوم رو اضافه کردم متوجه شدم که همون مشکل اصلی رو دارم محصولات فقط بر اساس موجودی مرتب میشه.
گفتم IQuerable میسازید از نمونه Context اصلی و تیکه تیکه ای شرط ها الزام میکنید. در نیتجه زنجیره ای از شرط ها به هم پیوسته خواهید داشت که روی IQuerable که کار میکنید پیاه میشه
بزودی یک همچین آموزش میگیرم برای چند شرطی ها
خب من الان هم به صورت odecrderby و thenbydec انجام دادم و هم به صورت orderbydec سپس نتیجه رو دوباره بر اساس orderbydec فیلتر کردم ولی نتیجه همونه و اون چیزی که میخوام نیست. میشه به صورت کد مثال بزنید.
مثل این که بالاخره جواب رو پیدا کردم.
var result= db.Products.OrderByDescending(p => p.Stock>0?p.ReleaseDate:new DateTime()).ThenByDescending(p=>p.ReleaseDate);
این جواب نزدیک ترین جوابیه که من پیدا کردم. محصولات از جدید به قدیم در سایت نمایش داده میشه و بعد از اون محصولات ناموجود نمایش داده میشه. دقیقا همون چیزی که میخواستم. نمیدونم حالا روش بهتری هست یا نه.
آره خوبه