دسته بندی ها
00:02 1398/08/24

جوین (Join) کردن جداول در Entity FrameworkCore

مشخصات سوال کننده :
کاربر : AliNoori     امتیاز کاربر : 136     رتبه کاربر : 11
دسته بندی : Asp.net Core

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 4303
هوش مصنوعی

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

برای انجام عملیات جوین بین جداول WorkGroup و Contacts در Entity Framework Core و نمایش نام گروه به جای ID، شما می توانید از ویژگی های ناوبری استفاده کنید. ابتدا باید در مدل Contacts یک رابطه به WorkGroup اضافه کنید. سپس می توانید با استفاده از Include نام گروه را به دست آورید.

ابتدا رابطه بین دو جدول را در کلاس Contacts به شکل زیر تعریف کنید:


public class Contacts
{
    public int ID { get; set; }

    // سایر ویژگی ها

    [ForeignKey("WorkGroup")]
    public int GroupID { get; set; } // به جای GroupName از GroupID استفاده کنید

    public virtual WorkGroup WorkGroup { get; set; } // اینجا رابطه ناوبری اضافه شده است
}

سپس برای دریافت لیستی از مخاطبین به همراه نام گروه، می توانید از کد زیر در عملیات انتخاب (Query) استفاده کنید:


var contactsWithGroupNames = await _context.Contacts
    .Include(c => c.WorkGroup) // بارگذاری گروه مرتبط
    .ToListAsync();

// حالا می توانید به نام گروه از طریق ویژگی WorkGroup دسترسی داشته باشید
foreach (var contact in contactsWithGroupNames)
{
    Console.WriteLine($"{contact.Name} - {contact.WorkGroup.GroupName}");
}

این کد ابتدا تمام مخاطبین را با نام گروه های متناظر بارگذاری می کند و سپس می توانید به راحتی نام گروه را برای هر مخاطب نشان دهید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 03:57 1398/08/24

بهتر بود فیلدهای جداول رو هم قرار میدادید.

میخواید توسط دستورات EF این کار رو انجام بدید ؟

به این پاسخ امتیاز بدهید    1
امتیاز: 1635 رتبه: 2
پاسخ دهنده : saedbfd 18:49 1398/08/24

با سلام

بهتر هست که جداول خودتون رو هم نمایش میدادید. چون ممکنه نیاز باشه که ViewModel تعریف بشه برای جوین کردن جداول در Entity Framework

به این پاسخ امتیاز بدهید    1
امتیاز: 1664 رتبه: 1
پاسخ دهنده : hamid_b 00:57 1398/08/25

توی جدول مخاطبین یا Contact شما گفتید ID گروه برای هر رکورد ثبت میشه

اما هیچ فیلدی نمیبینم برای نگهداری ID گروه. در واقع ID گروه باید در جدول مخاطبین به صورت کلید خارجی تعریف شده باشه.

نکته بعدی اینکه در جدول مخاطبین یک فیلد به نام ID تعریف کردید که احتمالا کلید اصلی شما هست ولی ویژگی Key رو بهش ندادید.

اما اگر فرض کنیم شما یک فیلد در جدول Contact به نام WorkGroupID تعریف کنید که کلید خارجی باشه، می تونید کار زیر رو انجام بدید.

 

1 - یک ViewModel به نام myViewModel بسازید

     public class myViewModel
        {
            public int WorkGroupID { get; set; }
            public int ContactID { get; set; }
            public string ContactName { get; set; }
            public string GroupName { get; set; }
        }

 

در ویومدل بالا ما 4 فیلد رو تعریف کردیم که میتونیم در ادامه این 4 فیلد رو دریافت کنیم و توی خروجی نمایش بدیم. (فیلد ContactName همون نام مخاطب هست و فیلد GroupName هم نام گروه)

حالا می تونید یک کوئری بنویسید که 2 جدول Contact و WorkGroup رو توی اون Join کنید و خروجی مورد نظر رو نمایش بدید

 

   public List<myViewModel> ContactList()
        {
            var ContactListquesr = (from c in _context.ContactTbl
                                  join
                                  w in _context.WorkGroupTbl on c.WorkGroupID equals w.Id
                                

                                  select new myViewModel()
                                  {
                                     WorkGroupID = w.Id,
                                     ContactID = c.Id,
                                     ContactName = c.Name,
                                     GroupName = w.groupName
                                  });

            return ContactListquesr.ToList();
        }

 

بعد از اجرا دستور بالا شما مقدار GroupName یا همون نام گروه رو در فراخوانی تابع ContactList دارید.

به این پاسخ امتیاز بدهید    2
امتیاز: 518 رتبه: 4
پاسخ دهنده : shaneh 10:00 1398/09/03

اگر هر مخاطب یک گروه میتونه داشته باشه باید جدول به نظر من به این صورت بشه..

 public class Contacts
    {
        public int ID { get; set; }

        [Display(Name = "نام")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "{0} را وارد نمائید .")]
        public string Name { get; set; }

        [Display(Name = "نام خانوادگی")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "{0} را وارد نمائید .")]
        public string Family { get; set; }

        [Display(Name = "شماره همراه")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "{0} را وارد نمائید .")]
        public string Phone { get; set; }

        [Display(Name = "نام گروه")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "{0} را وارد نمائید .")]
        public int GroupID { get; set; }

        [Display(Name = "موقعیت تعاونی")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "{0} را وارد نمائید .")]
        public int CooperativeLocation { get; set; }

        [Display(Name = "نوع تعاونی")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "{0} را وارد نمائید .")]
        public int CooperativeType { get; set; }

        [Display(Name = "وضعیت تعاونی")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "{0} را وارد نمائید .")]
        public int CooperativeCondition { get; set; }
        
         [ForeignKey("GroupID ")]
        public WorkGroup WorkGroups { get; set; }
    }

بعد هنگام فراخوانی به صورت زیر عمل میکنیم:

var c=_context.Contacts.Include(x=>x.WorkGroups).tolist()

بعد برای نمایش به صورت زیر GroupName را فراخوانی کنید:

c.WorkGroups.GroupName

 

به این پاسخ امتیاز بدهید    1
امتیاز: 5 رتبه: 110
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود