eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
119 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
دفترچه تلفن من.pdf
حجم: 534.5K
من دفترچه تلفن را ساختم با کمک مدرس ایمان مدائنی و توضیحاتی در آن قرار دادم https://eitaa.com/sisharpapp/256
MyContacts.zip
حجم: 139.6K
این فایل پروژه هست که تغییراتی در آن قرار دادم و به جای دکمه جدا در داخل لیست دکمه ویرایش و حذف قرار دادم
برای ساخت یک پنجره لاگین در سی شارپ و ویندوز فرم، می‌توانید مراحل زیر را دنبال کنید: 1- ایجاد فرم لاگین: - یک پروژه جدید ویندوز فرم در ویژوال استودیو ایجاد کنید. - یک فرم جدید به نام LoginForm اضافه کنید. - دو تکست باکس برای نام کاربری (txtUsername) و رمز عبور (txtPassword) و یک دکمه برای ورود (btnLogin) به فرم اضافه کنید. 2- طراحی فرم: - فرم را به شکلی طراحی کنید که کاربر بتواند نام کاربری و رمز عبور خود را وارد کند. - برای رمز عبور، خاصیت PasswordChar تکست باکس را تنظیم کنید تا کاراکترهای رمز عبور به صورت نقطه یا ستاره نمایش داده شوند. 3- اتصال به دیتابیس: - یک دیتابیس ایجاد کنید و جدولی به نام Users با ستون‌های Username و Password ایجاد کنید. - از کلاس‌های SqlConnection و SqlCommand برای اتصال به دیتابیس و اجرای کوئری‌ها استفاده کنید. 4- کدنویسی رویداد دکمه ورود: - در رویداد کلیک دکمه ورود، کد زیر را اضافه کنید تا نام کاربری و رمز عبور وارد شده را با اطلاعات موجود در دیتابیس مقایسه کند: using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace LoginApp { public partial class LoginForm : Form { public LoginForm() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { string connectionString = "your_connection_string_here"; using (SqlConnection connection = new SqlConnection(connectionString)) { string query = "SELECT COUNT(1) FROM Users WHERE Username=@Username AND Password=@Password"; SqlCommand command = new SqlCommand(query, connection); command.Parameters.AddWithValue("@Username", txtUsername.Text); command.Parameters.AddWithValue("@Password", txtPassword.Text); connection.Open(); int count = Convert.ToInt32(command.ExecuteScalar()); if (count == 1) { MessageBox.Show("Login successful!"); // Open the main form or perform other actions } else { MessageBox.Show("Username or password is incorrect."); } } } } } این کد بررسی می‌کند که آیا نام کاربری و رمز عبور وارد شده با اطلاعات موجود در دیتابیس مطابقت دارد یا خیر. در صورت موفقیت، پیام موفقیت‌آمیز نمایش داده می‌شود و در غیر این صورت، پیام خطا نمایش داده می‌شود. برای اطلاعات بیشتر و جزئیات دقیق‌تر، می‌توانید به منابع آموزشی آنلاین مراجعه کنید.
با استفاده از سی شارپ یک دیتابیس ایجاد کنید. برای این کار می‌توانید از ADO.NET و کلاس‌های مربوط به SQL Server استفاده کنید. در اینجا یک مثال ساده برای ایجاد یک دیتابیس در سی شارپ آورده شده است: - ایجاد پروژه: - یک پروژه جدید ویندوز فرم در ویژوال استودیو ایجاد کنید. - یک دکمه به فرم اضافه کنید و نام آن را btnCreateDatabase بگذارید. - اضافه کردن کد: - در رویداد کلیک دکمه، کد زیر را اضافه کنید تا یک دیتابیس جدید ایجاد شود: using System; using System.Data.SqlClient; using System.Windows.Forms; namespace CreateDatabaseApp { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnCreateDatabase_Click(object sender, EventArgs e) { string connectionString = "Server=localhost;Integrated security=SSPI;database=master"; using (SqlConnection connection = new SqlConnection(connectionString)) { string query = "CREATE DATABASE MyDatabase ON PRIMARY " + "(NAME = MyDatabase_Data, " + "FILENAME = 'C:\\MyDatabaseData.mdf', " + "SIZE = 2MB, MAXSIZE = 10MB, FILEGROWTH = 10%) " + "LOG ON (NAME = MyDatabase_Log, " + "FILENAME = 'C:\\MyDatabaseLog.ldf', " + "SIZE = 1MB, MAXSIZE = 5MB, FILEGROWTH = 10%)"; SqlCommand command = new SqlCommand(query, connection); try { connection.Open(); command.ExecuteNonQuery(); MessageBox.Show("Database created successfully!"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } } این کد یک دیتابیس جدید به نام MyDatabase ایجاد می‌کند و فایل‌های دیتابیس را در مسیر مشخص شده ذخیره می‌کند.
با استفاده از سی شارپ و ADO.NET جداول دیتابیس را ایجاد کنید. در اینجا یک مثال ساده برای ایجاد یک جدول در دیتابیس آورده شده است: - ایجاد پروژه: - یک پروژه جدید ویندوز فرم در ویژوال استودیو ایجاد کنید. - یک دکمه به فرم اضافه کنید و نام آن را btnCreateTable بگذارید. - اضافه کردن کد: - در رویداد کلیک دکمه، کد زیر را اضافه کنید تا یک جدول جدید ایجاد شود: using System; using System.Data.SqlClient; using System.Windows.Forms; namespace CreateTableApp { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnCreateTable_Click(object sender, EventArgs e) { string connectionString = "Server=localhost;Database=MyDatabase;Integrated Security=True;"; using (SqlConnection connection = new SqlConnection(connectionString)) { string query = "CREATE TABLE Users (" + "ID INT PRIMARY KEY IDENTITY(1,1), " + "Username NVARCHAR(50), " + "Password NVARCHAR(50))"; SqlCommand command = new SqlCommand(query, connection); try { connection.Open(); command.ExecuteNonQuery(); MessageBox.Show("Table created successfully!"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } } این کد یک جدول جدید به نام Users با ستون‌های ID، Username و Password ایجاد می‌کند.
لینک LINQ مخفف Language Integrated Query به معنای زبان پرس و جوی یکپارچه است. این تکنولوژی در نسخه 3.5 دات نت معرفی شد و به برنامه‌نویسان اجازه می‌دهد تا با استفاده از یک زبان واحد، داده‌ها را از منابع مختلف مانند لیست‌ها، آرایه‌ها، دیتابیس‌ها و فایل‌های XML پرس و جو کنند. مزایای LINQ:- خوانایی کد: کدهای نوشته شده با LINQ خواناتر و قابل فهم‌تر هستند. - سرعت توسعه: با استفاده از LINQ، نیازی به نوشتن کدهای پیچیده برای دسترسی به داده‌ها نیست و می‌توان سریع‌تر برنامه‌ها را توسعه داد. - کاهش خطاها: به دلیل خوانایی بالای کدهای LINQ، اشکال‌زدایی و رفع خطاها آسان‌تر می‌شود. - پشتیبانی از انواع داده‌ها: LINQ می‌تواند با انواع مختلف منابع داده مانند دیتابیس‌ها، لیست‌ها، آرایه‌ها و فایل‌های XML کار کند. انواع LINQ:- LINQ to Objects: برای کار با مجموعه‌های درون حافظه مانند لیست‌ها و آرایه‌ها. - LINQ to SQL: برای کار با دیتابیس‌های SQL Server. - LINQ to XML: برای کار با فایل‌های XML. - LINQ to Entities: برای کار با Entity Framework. مثال ساده: List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var evenNumbers = from number in numbers where number % 2 == 0 select number; foreach (var num in evenNumbers) { Console.WriteLine(num); } این کد اعداد زوج را از لیست numbers انتخاب کرده و چاپ می‌کند.
Select * From Person as p و From p in Person Select p برای توضیح دستورات SQL و نحوه استفاده از آن‌ها در یک برنامه کنسول سی‌شارپ، ابتدا به توضیح هر دستور می‌پردازیم و سپس یک مثال عملی ارائه می‌دهیم. دستور SELECT * FROM Person AS pاین دستور تمام ستون‌های جدول Person را انتخاب می‌کند و به آن یک نام مستعار p می‌دهد. به عبارت دیگر، این دستور تمام رکوردهای موجود در جدول Person را بازیابی می‌کند. دستور FROM p in Person SELECT pاین دستور مشابه دستور قبلی است، اما به سبک LINQ در سی‌شارپ نوشته شده است. این دستور تمام رکوردهای جدول Person را انتخاب می‌کند و هر رکورد را به صورت یک شیء p برمی‌گرداند. مثال کنسول سی‌شارپدر این مثال، فرض می‌کنیم که یک پایگاه داده SQL Server داریم که شامل جدولی به نام Person است. ابتدا باید یک اتصال به پایگاه داده برقرار کنیم و سپس داده‌ها را بازیابی کنیم. using System; using System.Data.SqlClient; using System.Linq; using System.Collections.Generic; namespace ConsoleApp { class Program { static void Main(string[] args) { string connectionString = "your_connection_string_here"; List<Person> people = new List<Person>(); using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string query = "SELECT * FROM Person"; SqlCommand command = new SqlCommand(query, connection); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { Person person = new Person { Id = reader.GetInt32(0), Name = reader.GetString(1), Age = reader.GetInt32(2) }; people.Add(person); } } var selectedPeople = from p in people select p; foreach (var person in selectedPeople) { Console.WriteLine($"ID: {person.Id}, Name: {person.Name}, Age: {person.Age}"); } } } class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } } در این مثال: - ابتدا یک اتصال به پایگاه داده SQL Server برقرار می‌کنیم. - با استفاده از دستور SELECT * FROM Person تمام رکوردهای جدول Person را بازیابی می‌کنیم. - داده‌های بازیابی شده را در یک لیست از اشیاء Person ذخیره می‌کنیم. - با استفاده از LINQ، تمام رکوردهای موجود در لیست را انتخاب و چاپ می‌کنیم.
int[] numbers = { 1, 3, 5, 7, 9, 10, 15, 19, 20, 25, 34, 46, 50, 60, 70, 80, 100 }; این خط یک آرایه از اعداد صحیح به نام numbers ایجاد می‌کند. int[] result1 = (from n in numbers select n).ToArray(); این خط تمام اعداد موجود در آرایه numbers را انتخاب کرده و به یک آرایه جدید به نام result1 تبدیل می‌کند. int[] result2 = (from n in numbers orderby n descending select n).ToArray(); این خط اعداد موجود در آرایه numbers را به ترتیب نزولی مرتب کرده و به یک آرایه جدید به نام result2 تبدیل می‌کند. int[] result3 = (from n in numbers where n > 30 && n < 80 orderby n descending select n).ToArray(); این خط اعداد بزرگتر از 30 و کوچکتر از 80 را از آرایه numbers انتخاب کرده، به ترتیب نزولی مرتب کرده و به یک آرایه جدید به نام result3 تبدیل می‌کند. int result4 = (from n in numbers where n == 3 select n).First(); این خط اولین عدد برابر با 3 را از آرایه numbers انتخاب کرده و به متغیر result4 اختصاص می‌دهد. int result5 = (from n in numbers where n == 2 select n).FirstOrDefault(); این خط اولین عدد برابر با 2 را از آرایه numbers انتخاب کرده و به متغیر result5 اختصاص می‌دهد. اگر چنین عددی وجود نداشته باشد، مقدار پیش‌فرض (صفر) را برمی‌گرداند. int result6 = (from n in numbers where n == 3 select n).Single(); این خط تنها عدد برابر با 3 را از آرایه numbers انتخاب کرده و به متغیر result6 اختصاص می‌دهد. اگر بیش از یک عدد برابر با 3 وجود داشته باشد، خطا رخ می‌دهد. int result7 = (from n in numbers where n == 2 select n).SingleOrDefault(); این خط تنها عدد برابر با 2 را از آرایه numbers انتخاب کرده و به متغیر result7 اختصاص می‌دهد. اگر چنین عددی وجود نداشته باشد، مقدار پیش‌فرض (صفر) را برمی‌گرداند. var i1 = 123; var i2 = "Iman Madaeny"; var i3 = DateTime.Now; //i1 = "Iman"; این خطوط متغیرهای i1، i2 و i3 را با مقادیر مختلف مقداردهی می‌کنند. خط آخر که کامنت شده است، نشان می‌دهد که نمی‌توان مقدار i1 را به یک رشته تغییر داد. bool result8 = (from n in numbers where n == 2 select n).Any(); این خط بررسی می‌کند که آیا عددی برابر با 2 در آرایه numbers وجود دارد یا خیر و نتیجه را به متغیر result8 اختصاص می‌دهد. int Count = (from n in numbers select n).Count(); int Max = (from n in numbers select n).Max(); int Min = (from n in numbers select n).Min(); int Sum = (from n in numbers select n).Sum(); این خطوط تعداد عناصر، بیشترین مقدار، کمترین مقدار و مجموع اعداد موجود در آرایه numbers را محاسبه می‌کنند. List<string> Names = new List<string>(); Names.Add("Iman"); Names.Add("Ali"); Names.Add("Sara"); Names.Add("Mohammad"); Names.Add("Mina"); این خطوط یک لیست از رشته‌ها به نام Names ایجاد کرده و چند نام به آن اضافه می‌کنند. var res1 = (from n in Names select n).ToList(); این خط تمام نام‌های موجود در لیست Names را انتخاب کرده و به یک لیست جدید به نام res1 تبدیل می‌کند. var res2 = (from n in Names where n.ToLower().Contains("i") select n).ToList(); این خط نام‌هایی که شامل حرف "i" هستند را از لیست Names انتخاب کرده و به یک لیست جدید به نام res2 تبدیل می‌کند. var res3 = (from n in Names where n.ToLower().StartsWith("i") select n).ToList(); این خط نام‌هایی که با حرف "i" شروع می‌شوند را از لیست Names انتخاب کرده و به یک لیست جدید به نام res3 تبدیل می‌کند. var res4 = (from n in Names where n.ToLower().EndsWith("i") select n).ToList(); این خط نام‌هایی که با حرف "i" تمام می‌شوند را از لیست Names انتخاب کرده و به یک لیست جدید به نام res4 تبدیل می‌کند.
عبارات لامبدا (Lambda Expressions) در سی شارپ یک روش ساده برای تعریف متدهای ناشناس هستند که به عنوان مقادیر از نوع Delegate استفاده می‌شوند. این عبارات به شما اجازه می‌دهند تا بدون نیاز به تعریف یک متد جداگانه، به سادگی یک تابع را درون کد خود تعریف و از آن استفاده کنید. ساختار یک عبارت لامبدا به صورت زیر است: (parameters) => expression برای مثال، فرض کنید می‌خواهید لیستی از اعداد را فیلتر کنید تا فقط اعدادی که بزرگتر از ۱۰ هستند باقی بمانند: List<int> numbers = new List<int> { 5, 10, 15, 20, 25 }; var filteredNumbers = numbers.Where(n => n > 10).ToList(); در این مثال، عبارت n => n > 10 یک لامبدا است که به عنوان یک شرط برای فیلتر کردن لیست اعداد استفاده می‌شود.
تعریف آرایه اعداد int[] numbers = { 1, 3, 5, 7, 9, 10, 15, 19, 20, 25, 34, 46, 50, 60, 70, 80, 100 }; این خط یک آرایه از اعداد صحیح به نام numbers تعریف می‌کند. مثال‌های مختلف با استفاده از LINQ و عبارات لامبدا- کپی کردن آرایه به یک آرایه جدید int[] result1 = (from n in numbers select n).ToArray(); var lambda1 = numbers.ToArray(); هر دو خط کد یک کپی از آرایه numbers ایجاد می‌کنند. - مرتب‌سازی نزولی int[] result2 = (from n in numbers orderby n descending select n).ToArray(); var lambda2 = numbers.OrderByDescending(n => n).ToArray(); این خطوط کد آرایه numbers را به صورت نزولی مرتب کرده و نتیجه را به یک آرایه جدید تبدیل می‌کنند. - فیلتر کردن و مرتب‌سازی نزولی int[] result3 = (from n in numbers where n > 30 && n < 80 orderby n descending select n).ToArray(); var lambda3 = numbers.Where(n => n > 30 && n < 80).OrderByDescending(n => n).ToArray(); این خطوط کد اعداد بین ۳۰ و ۸۰ را فیلتر کرده و سپس به صورت نزولی مرتب می‌کنند. - یافتن اولین عدد برابر با ۳ int result4 = (from n in numbers where n == 3 select n).First(); var lambda4 = numbers.First(n => n == 4); این خطوط کد اولین عدد برابر با ۳ را پیدا می‌کنند. توجه کنید که در lambda4 باید عدد ۳ باشد نه ۴. - یافتن اولین عدد برابر با ۲ یا مقدار پیش‌فرض int result5 = (from n in numbers where n == 2 select n).FirstOrDefault(); var lambda5 = numbers.FirstOrDefault(n => n == 2); این خطوط کد اولین عدد برابر با ۲ را پیدا می‌کنند یا اگر وجود نداشت مقدار پیش‌فرض (۰) را برمی‌گردانند. - یافتن تنها عدد برابر با ۳ int result6 = (from n in numbers where n == 3 select n).Single(); این خط کد تنها عدد برابر با ۳ را پیدا می‌کند و اگر بیش از یک عدد وجود داشته باشد، خطا می‌دهد. - یافتن تنها عدد برابر با ۲ یا مقدار پیش‌فرض int result7 = (from n in numbers where n == 2 select n).SingleOrDefault(); این خط کد تنها عدد برابر با ۲ را پیدا می‌کند یا اگر وجود نداشت مقدار پیش‌فرض (۰) را برمی‌گرداند. - بررسی وجود عدد برابر با ۲ bool result8 = (from n in numbers where n == 2 select n).Any(); var lambda8 = numbers.Any(n => n == 2); این خطوط کد بررسی می‌کنند که آیا عدد ۲ در آرایه وجود دارد یا خیر. - تعداد اعداد در آرایه int Count = (from n in numbers select n).Count(); var count = numbers.Count(); این خطوط کد تعداد اعداد در آرایه را برمی‌گردانند. - بیشترین و کمترین عدد در آرایه int Max = (from n in numbers select n).Max(); int Min = (from n in numbers select n).Min(); این خطوط کد بیشترین و کمترین عدد در آرایه را برمی‌گردانند. - مجموع اعداد در آرایه int Sum = (from n in numbers select n).Sum(); این خط کد مجموع اعداد در آرایه را برمی‌گرداند. کار با لیست اسامی List<string> Names = new List<string>(); Names.Add("Iman"); Names.Add("Ali"); Names.Add("Sara"); Names.Add("Mohammad"); Names.Add("Mina"); این خطوط کد یک لیست از اسامی ایجاد و چند نام به آن اضافه می‌کنند. - کپی کردن لیست به یک لیست جدید var res1 = (from n in Names select n).ToList(); var lam1 = Names.ToList(); هر دو خط کد یک کپی از لیست Names ایجاد می‌کنند. - فیلتر کردن اسامی که شامل حرف "i" هستند var res2 = (from n in Names where n.ToLower().Contains("i") select n).ToList(); var lam2 = Names.Where(n => n.ToLower().Contains("i")).ToList(); این خطوط کد اسامی که شامل حرف "i" هستند را فیلتر می‌کنند. - فیلتر کردن اسامی که با حرف "i" شروع می‌شوند var res3 = (from n in Names where n.ToLower().StartsWith("i") select n).ToList(); این خط کد اسامی که با حرف "i" شروع می‌شوند را فیلتر می‌کند. - فیلتر کردن اسامی که با حرف "i" تمام می‌شوند var res4 = (from n in Names where n.ToLower().EndsWith("i") select n).ToList(); این خط کد اسامی که با حرف "i" تمام می‌شوند را فیلتر می‌کند.
در اینجا سه روش مختلف برای افزودن اشیاء به لیست List<Person> را مشاهده می‌کنید. هر کدام از این روش‌ها مزایا و معایب خاص خود را دارند: - روش اول: ایجاد شیء و سپس تنظیم خصوصیات Person p1 = new Person(); p1.PersonID = 1; p1.Name = "Iman"; p1.family = "Madaeny"; p1.Age = 30; people.Add(p1); - مزایا: خوانایی بالا، مناسب برای زمانی که نیاز به تنظیم خصوصیات به صورت جداگانه دارید. - معایب: طولانی‌تر و نیاز به خطوط کد بیشتر. - روش دوم: استفاده از مقداردهی اولیه شیء Person p2 = new Person() { PersonID = 2, Name = "Sara", family = "Ahmadi", Age = 18 }; people.Add(p2); - مزایا: کوتاه‌تر و خواناتر، مناسب برای زمانی که می‌خواهید تمام خصوصیات را به صورت همزمان تنظیم کنید. - معایب: ممکن است برای اشیاء پیچیده‌تر کمتر خوانا باشد. - روش سوم: افزودن مستقیم شیء به لیست people.Add(new Person() { PersonID = 3, Name = "Ali", family = "Rezai", Age = 41 }); - مزایا: کوتاه‌ترین روش، مناسب برای افزودن سریع اشیاء به لیست. - معایب: ممکن است خوانایی کد را کاهش دهد و برای اشیاء پیچیده‌تر کمتر مناسب باشد. هر کدام از این روش‌ها بسته به نیاز و شرایط خاص پروژه می‌توانند مفید باشند.
یک مثال عملی کلاس Person internal class Person { public int PersonID { get; set; } public string Name { get; set; } public string family { get; set; } public int Age { get; set; } } کلاس PersonCar internal class PersonCar { public int PersonID { get; set; } public string CarName { get; set; } public string CarModel { get; set; } } کلاس Program static void Main(string[] args) { List<Person> people = new List<Person>(); Person p1 = new Person(); p1.PersonID = 1; p1.Name = "Iman"; p1.family = "Madaeny"; p1.Age = 30; people.Add(p1); Person p2 = new Person() { PersonID = 2, Name = "Sara", family = "Ahmadi", Age = 18 }; people.Add(p2); people.Add(new Person() { PersonID = 3, Name = "Ali", family = "Rezai", Age = 41 }); Console.WriteLine("------------ result1 ------------"); var result1 = people.ToList(); foreach (var p in result1) { Console.WriteLine($"ID : {p.PersonID} Name : {p.Name} Family : {p.family} Age : {p.Age}"); } Console.WriteLine("----------- result2 ----------"); var result2 = people.OrderByDescending(p => p.Age).ToList(); foreach (var p in result2) { Console.WriteLine($"ID : {p.PersonID} Name : {p.Name} Family : {p.family} Age : {p.Age}"); } Console.WriteLine("----------- result3 ----------"); var result3 = people.Where(p => p.Name.ToLower() == "iman").ToList(); foreach (var p in result3) { Console.WriteLine($"ID : {p.PersonID} Name : {p.Name} Family : {p.family} Age : {p.Age}"); } Console.WriteLine("---------- result4 -----------"); var result4 = people.Where(p => p.Age > 25 && p.Age < 40).ToList(); foreach (var p in result4) { Console.WriteLine($"ID : {p.PersonID} Name : {p.Name} Family : {p.family} Age : {p.Age}"); } Console.WriteLine("---------- result5 -----------"); var result5 = people.Select(p => p.Name).ToList(); foreach (var p in result5) { Console.WriteLine($"result : {p}"); } Console.WriteLine("---------- result6 -----------"); var result6 = people.Select(p => new { p.Name, p.Age }).ToList(); foreach (var p in result6) { Console.WriteLine($"result : {p}"); } Console.WriteLine("---------- join -----------"); List<PersonCar> Cars = new List<PersonCar>() { new PersonCar() { PersonID = 1, CarName = "Pride", CarModel = "1380" }, new PersonCar() { PersonID = 3, CarName = "peykan", CarModel = "1382" } }; var join =(from p in people join c in Cars on p .PersonID equals c.PersonID select new { p.PersonID, p.Name, p.family, p.Age, c.CarName, c.CarModel }).ToList(); foreach(var p in join) { Console.WriteLine($"result : {p}"); } Console.ReadKey(); }