آموزش Single Table Inheritance در LINQ to SQL
Loading...
Single Table Inheritance

در این مقاله Single Table Inheritance را در LINQ to SQL بررسی می کنیم.ابتدا توضیحات مقدماتی در رابطه با Single Table Inheritance داریم همراه من باشید.

Single Table Inheritance چیست؟

ارث بری جدول واحد همچنین نگاشت فیلتر یا نگاشت تبعیضی (نشانه گذاری با علائم خاص) یا جدول در نگاشت سلسله مراتبی نیز نامیده می شود.

با ارث بری جدول واحد، یک جدول دیتابیس برای ذخیره داده های همه انواع موجودیت ها در سراسر سلسله مراتب ارث بری استفاده می شود. اجازه دهید با یک مثال توضیح دهیم.

ابتدا یک جدول ایجاد کرده و یک سری داده به آن وارد می کنیم.

Create Table SingleEmployees

(

ID int primary key identity,

Name nvarchar(50),

Gender nvarchar(50),

AnuualSalary int,

HourlyPay int,

HoursWorked int,

Discriminator nvarchar(50)

)

Insert into SingleEmployees values ('رضایی', 'مرد', ۶۰۰۰۰, NULL, NULL, 'کارمند رسمی')

Insert into SingleEmployees values ('نائینی', 'مرد', NULL, 50, 160, 'کارمند قراردادی')

Insert into SingleEmployees values ('ناصری', 'مرد', NULL, 40, 120, 'کارمند قراردادی')

Insert into SingleEmployees values ('رحیمی', 'مرد', ۴۵۰۰۰, NULL, NULL, 'کارمند رسمی')

Insert into SingleEmployees values ('نصرتی', 'زن', ۳۰۰۰۰, NULL, NULL, 'کارمند رسمی')

Insert into SingleEmployees values ('رهنما', 'زن', NULL, 30, 140, 'کارمند قراردادی')

GO

حال، این جدول داده های هر دو نوع کارمند را در خود ذخیره می کند. به عنوان مثال هم کارمند رسمی و هم کارمند قراردادی. بعضی از ستون های این جدول فقط مختص کارمندان رسمی است.

برای مثال ستون Annual Salary یا حقوق سالیانه به کارمندان رسمی اختصاص دارد، که به این معنی است که زمانی که ما یک رکورد از کارمند قراردادی وارد می کنیم این ستون ها NULL خواهند بود.

Single Table Inheritance

به همین ترتیب، پرداخت ساعتی و ساعات کار نیز مخصوص کارمندان قراردادی است و زمانی که داده های یک کارمند رسمی وارد جدول می شود، این ستون ها برای کارمندان رسمی NULL خواهد بود. سایر ستون ها مانند آی دی، نام و جنسیت برای هر دو نوع کارمند مشترک است. این ستون متمایز کننده برای تمییز قائل شدن بین دو نوع کارمند رسمی و قراردادی استفاده می شود.

حال، زمانی که از LINQ to SQL class designer استفاده می کنیم و اگر یک کلاس براساس این جدول طراحی کنیم، به طور پیش فرض، LINQ to SQL یک کلاس employee ایجاد می کند.

یک empty Application ایجاد می کنیم. یک فایل LINQ to SQL اضافه کرده و اسم آن را Sample.dbml می گذاریم. حال، جدول را کشیده و در محیط designer رها می کنیم.

Single Table Inheritance

بنابراین، یک کلاس ایجاد می کنیم. حالا، در سازمان خود دو نوع کارمند داریم. یکی کارمند رسمی و دیگری کارمند قراردادی است.

بنابراین، حالا باید کلاس خود را طوری طراحی کنیم که Employee کلاس پایه ما شود (این کلاس شامل ستون های مشترک خواهد بود)، که با هر دو نوع کارمند به اشتراک گذاشته می شود.

روی صفحه designer راست کلیک کرده Add و سپس Class را انتخاب کرده و نام آن را به Permanent Employee تغییر می دهیم. Annual Salary را به عنوان فیلدی که متعلق به کلاس Permanent Employee است به آن اضافه می کنیم. به همین ترتیب کلاس دیگری با نام ContractEmployee ایجاد کرده و دو ستون HouresWorked و HourlyPay را به آن اضافه می کنیم.

پس، designer ما به شکل زیر در می آید:

Single Table Inheritance

مرحله بعدی ایجاد وراثت بین این کلاس هاست. حالا روی کلاس Employee راست کلیک کرده Add و سپس Inheritance را انتخاب می کنیم. کلاس پایه ما Employee و کلاس مشتق شده Permanent Employee و به همین ترتیب ContractEmployee هستند.

Single Table Inheritance

حال بین کارمند رسمی و قراردادی تمییز قائل میشویم، از property متمایز کننده استفاده می کنیم. پس، باید مقدارها را مشخص کنیم. پس روی رابطه وراثت راست کلیک می کنیم.

Single Table Inheritance

این متمایزکننده است که ما برای تفاوت قائل شدن بین کارمند قراردادی و رسمی استفاده می کنیم. حال، ویژگی Derived Class Discriminator را برابر با کلاس PermanentEmployee قرار می دهیم.

Single Table Inheritance

همچنین ویژگی Inheritance را مشخص می کنیم که به طور پیش فرض PermanentEmployee است.

Single Table Inheritance

همین کار را برای ContractEmployee نیز انجام می دهیم. تا اینجا طراحی کلاس های ما به پایان رسید. حالا در پشت این طراحی سه کلاس برای ما ایجاد شده است که Employee، PermanentEmployee و ContractEmployee هستند.

Single Table Inheritance

حال، یک webForm به پروژه اضافه می کنیم.

Single Table Inheritance

درون این وب فرم لیستی از Radio button برای بارگذاری همه کارمندان، کارمندان رسمی و قراردادی داریم و آن ها را در GridView نمایش می دهیم.

کد مربوط به فایل Webform1.aspx

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title></title>

</head>

<body>

<form id="form1" runat="server">

<div style="font-family: Arial">

<asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True"

onselectedindexchanged="RadioButtonList1_SelectedIndexChanged">

<asp:ListItem Text="لیست همه کارمندان" Value="All"></asp:ListItem>

<asp:ListItem Text="لیست کارمندان رسمی" Value="Permanent">

</asp:ListItem>

<asp:ListItem Text="لیست کارمندان قراردادی" Value="Contract">

</asp:ListItem>

</asp:RadioButtonList>

<asp:GridView ID="GridView1" runat="server">

</asp:GridView>

</div>

</form>

</body>

</html>

کد مربوط به فایل سی شارپ

protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)

{

SampleDataContext dbContext = new SampleDataContext();

dbContext.Log = Response.Output;

&nbsp;

switch (RadioButtonList1.SelectedValue)

{

case "Permanent":

GridView1.DataSource =

dbContext.SingleEmployees.OfType<PermanentEmployee>().ToList();

GridView1.DataBind();

break;

&nbsp;

case "Contract":

GridView1.DataSource =

dbContext.SingleEmployees.OfType<ContractEmployee>().ToList();

GridView1.DataBind();

break;

&nbsp;

default:

GridView1.DataSource =

ConvertEmployeesForDisplay(dbContext.SingleEmployees.ToList());

GridView1.DataBind();

break;

}

برای لیست Radio Button از switch case استفاده کردیم، زمانی که permanent انتخاب شده باشد، می خواهیم کارمندان رسمی را ببینیم که شی ای از این کلاس ایجاد کردیم. به همین صورت این کار را برای کارمندان قراردادی و مقدار پیش فرض نیز انجام دادیم.

با توجه به تنظیماتی که داشتیم، ویژگی هایی که نمایش داده می شوند، ID، نام و جنسیت و ستون متمایز کننده است که ویژگی های تعریف شده در کلاس abstract پایه یعنی Employee هستند. کلاس Employee را باید abstract کنیم، برای این کار روی نام کلاس کلیک کرده و Properties را انتخاب می کنیم.

مانند شکل زیر Inheritance Modifier را به abstract تغییر می دهیم.

Single Table Inheritance

حالا اگر دوباره برنامه را اجرا کنیم، می بینیم که فقط ویژگی های نوعی که درخواست کردیم نمایش داده می شود. اگر بخواهیم همه ستون ها مانند پرداخت ساعتی و ساعات کاری و… را ببینیم باید یک متد private به شکل زیر بنویسیم:

private DataTable ConvertEmployeesForDisplay(List<SingleEmployee> employees)

{

DataTable dt = new DataTable();

dt.Columns.Add("ID");

dt.Columns.Add("Name");

dt.Columns.Add("Gender");

dt.Columns.Add("AnuualSalary");

dt.Columns.Add("HourlyPay");

dt.Columns.Add("HoursWorked");

dt.Columns.Add("Type");

&nbsp;

foreach (SingleEmployee employee in employees)

{

DataRow dr = dt.NewRow();

dr["ID"] = employee.ID;

dr["Name"] = employee.Name;

dr["Gender"] = employee.Gender;

&nbsp;

if (employee is PermanentEmployee)

{

dr["AnuualSalary"] = ((PermanentEmployee)employee).AnuualSalary;

dr["Type"] = "Permanent";

}

else

{

dr["HourlyPay"] = ((ContractEmployee)employee).HourlyPay;

dr["HoursWorked"] = ((ContractEmployee)employee).HoursWorked;

dr["Type"] = "Contract";

}

dt.Rows.Add(dr);

}

return dt;

}

این متد، یک data table برمی گرداند و ما لیست اشیای employee را ارسال کرده و این متد یک data table جدید برمی گرداند. علاوه بر این، data table شامل ستون های مربوطه خواهد بود و برای هر حلقه تکرار از آن استفاده می کنیم.

لازم است که حقوق سالیانه، پرداخت ساعتی و دیگر جزئیات کارمندان فقط برای نوع خاصی از کارمندان نمایش داده شود. بنابراین، ما شی employee را به permanentEmployee تبدیل می کنیم.



avatar فاطمه زکایی

فاطمه زکایی هستم. فارغ التحصیل کارشناسی مهندسی نرم افزار، مدت سه سال هست که در زمینه توسعه اپلیکیشن های تحت وب و اندروید و همچنین تولید محتوای تخصصی برنامه نویسی تحت وب و اندروید در مجموعه mspsoft در خدمت شما هستم.

آخرین مطالب و تخفیفات در کانال تلگرام :) کانال تلگرام ام اس پی سافت
مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۰۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...