جوین (Join) کردن جداول در Entity FrameworkCore
با سلام
من در برنامم 2 جدول دارم به نام گروه (Groups) و مخاطبین (Contacts) که در جدول مخاطبین ID جدول گروه برای هر رکورد ثبت میشه
مشکل من اینجاس که میخام به جای شماره ID ، نام گروه (GroupName) از جدول گروه نشون داده بشه .
برنامه با AspCore3 نوشته شده . تشکر
جدول Work Group
public class WorkGroup
{
public int ID { get; set; }
[Display(Name ="نام گروه")]
[Required(AllowEmptyStrings =false,ErrorMessage ="{0} را وارد نمایید.")]
public string GroupName { get; set; }
[Display(Name = "دسترسی به زیر مجموعه")]
[Required(AllowEmptyStrings = false, ErrorMessage = "وضعیت {0} را مشخص نمایید .")]
public bool AccessSubgroups { get; set; }
[Display(Name = "توضیحات")]
public string Description { get; set; }
public string UserID { get; set; }
[ForeignKey(nameof(UserID))]
public virtual ApplicationUsers Users { get; set; }
}
جدول Contacts
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 GroupName { 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; }
public ICollection<WorkGroup> WorkGroups { get; set; }
}
پاسخ هوش مصنوعی
برای انجام عملیات جوین بین جداول 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}");
}
این کد ابتدا تمام مخاطبین را با نام گروه های متناظر بارگذاری می کند و سپس می توانید به راحتی نام گروه را برای هر مخاطب نشان دهید.
بهتر بود فیلدهای جداول رو هم قرار میدادید.
میخواید توسط دستورات EF این کار رو انجام بدید ؟
با سلام
بهتر هست که جداول خودتون رو هم نمایش میدادید. چون ممکنه نیاز باشه که ViewModel تعریف بشه برای جوین کردن جداول در Entity Framework
توی جدول مخاطبین یا 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 دارید.
اگر هر مخاطب یک گروه میتونه داشته باشه باید جدول به نظر من به این صورت بشه..
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
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2