دسته بندی ها
03:20 1401/05/25

نوشتن کویری به صورت تو در تو در Entity Framework

مشخصات سوال کننده :
کاربر : rezanoori     امتیاز کاربر : 0     رتبه کاربر : 7080
دسته بندی : Entity Framework

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2597
1 نظر
mmr1401 : سلام قبل نوشتن اون پاسخ منم مثل کاربر saedbfd میخواستم پیشنهاد بدم خب دو تا جدول کن این محصولات اصلی و زیرمحصولات. حالا نمیدونم دلیل خاصی داره که اینکارو نمیکنی؟ فکرکنم دو تا جدول داشتن در این مورد ساده ترین و بهترین کار باشه

امتیاز کاربر : 45   رتبه کاربر : 19   تاریخ ثبت : 02:38 1401/05/26
هوش مصنوعی

پاسخ هوش مصنوعی

برای ایجاد یک رابطه درون جدولی بین محصولات و زیرمحصولات در Entity Framework، می توانید از روش Include برای بارگذاری محصولات و زیرمحصولات همراه آن ها استفاده کنید. برای این کار، ابتدا باید یک رابطه ناهمواری بین Product و خود آن تعریف کنید.

به عنوان مثال، می توانید یک خاصیت ناهموار برای زیرمحصولات به مدل Product اضافه کنید:

public partial class Product
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Image { get; set; }
    public string Content { get; set; }
    public string Tags { get; set; }
    public int Sub { get; set; }

    public virtual ICollection SubProducts { get; set; }
}

سپس در DbContext خود می توانید رابطه را تنظیم کنید:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasMany(p => p.SubProducts)
        .WithOne()
        .HasForeignKey(p => p.Sub);
}

حالا شما می توانید هنگام بارگذاری یک محصول، زیرمحصولات مربوط به آن را با استفاده از Include بارگذاری کنید:

var productWithSubProducts = context.Products
    .Include(p => p.SubProducts)
    .FirstOrDefault(p => p.Id == productId);

این کد، محصول اصلی با شناسه productId را از دیتابیس واکشی کرده و زیرمحصولات مرتبط را نیز به همراه آن بارگذاری می کند. این روش باید سریع تر از روش های پیچیده تر باشد و به شما اجازه می دهد که به سادگی به اطلاعات مورد نیاز دسترسی پیدا کنید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : mmr1401 08:46 1401/05/25

سلام

اگر public int Sub { get; set; }  شماره محصول اصلی باشه که این محصول زیرمحصول اون حساب میشه به نظرم میتونی از select استفاده کنی

 

select id,title,sub,
            (select count(id) from product as p2 where p1.id=p2.sub) as subproduct
from product as p1

 

البته این select و من توی یکی از جداول دیتابیس sql  استفاده میکنم که ساختارش شبیه هم سوال شما هست.

به این پاسخ امتیاز بدهید    0
امتیاز: 45 رتبه: 19
1 نظر
rezanoori : ممنون از پاسختون ولی این چیزی که شما نوشتید مربوط به TSQL هستش که تو این حالت اوکیه ولی همین رو اگه بخوایم توی linq پیاده کنیم تقریبا مصیبت میشه

امتیاز کاربر : 0   رتبه کاربر : 7080   تاریخ ثبت : 11:52 1401/05/25
پاسخ دهنده : saedbfd 10:12 1401/05/25

بهتر بود کوئری که نوشتید هم قرار می دادید تا اگر اشکالی داره بهتون گفته بشه.

شما می فرمایید یک سری محصول اصلی دارید و یک سری محصول که وابسته و زیرگروه محصولات اصلی هستن.

خب بهتره در این شرایط شما 2 تا جدول داشته باشید. جدول اول محصولات اصلی رو نگهداری کنید و در جدول دوم محصولات زیر گروه . مثل گروه و زیر گروه میشه. در واقع ساختار شما Parent و Child هست و باید به همین صورت هم جداولتون طراحی بشه. مطمئنا اگر غیر از این باشه به مشکلات زیادی بعدا برخورد خواهید کرد.

به این پاسخ امتیاز بدهید    0
امتیاز: 1664 رتبه: 1
پاسخ دهنده : hamid_b 18:31 1401/05/25

بهتر بود کدهاتون رو هم قرار می دادید. اما با توجه به پاسخ mmr1401 همین رو به صورت انتیتی فریم ورک براتون می نویسم :

کوئری در T-Sql :

select id,title,sub,
            (select count(id) from product as p2 where p1.id=p2.sub) as subproduct
from product as p1

 

این کوئری رو شما به راحتی میتونید با انتیتی هم بنویسید. به صورت زیر :

var query = (from p in _db.product
             select new
             {
                id = p.id,
                title = p.title,
                sub = p.sub,
                pcount = _db.product.where(p2=>p2.sub == p.id).count()
              }

شما کافیه

ویرایش شده در سه شنبه 25 مرداد 1401 ساعت 18:31:50
به این پاسخ امتیاز بدهید    0
امتیاز: 518 رتبه: 4
1 نظر
rezanoori : منم همین حالت رو پیاده کردم ولی مشکلی که وجود داره سلکت تو در تو در stored prosedure تولید شده توسط اینتیتی زیاد میشه بخاطر اینکه داخل تگ select مجددا db فراخوانی میشه امکان گذاشتن کد به دلایلی برام مقدور نبود و بابت این نتونستم بذارم

امتیاز کاربر : 0   رتبه کاربر : 7080   تاریخ ثبت : 08:49 1401/05/25
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود