با استفاده از سی شارپ یک دیتابیس ایجاد کنید. برای این کار میتوانید از 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();
}
linq-learning-SourceSara.com.pdf
حجم:
4.7M
توضیحات بیشتر در این فایل قرار دارد
سایت روکسو یک منبع عالی برای آموزش LINQ در سی شارپ (C#) است. این سایت آموزشهای مقدماتی تا پیشرفته را به صورت رایگان ارائه میدهد و تمامی مباحث LINQ را به صورت مثال محور و کاربردی پوشش میدهد.
شما میتوانید از طریق لینک زیر به این آموزشها دسترسی پیدا کنید:
https://www.roxo.ir/series/linq-tutorials
Entity Framework (EF)
یک ORM (Object-Relational Mapping) برای .NET است که به توسعهدهندگان اجازه میدهد با پایگاهدادهها به صورت شیءگرا کار کنند. این ابزار به شما کمک میکند تا از کدهای SQL مستقیم بینیاز شوید و تمام عملیات پایگاهداده را از طریق کدهای سی شارپ انجام دهید.
به طور خلاصه، EF فرآیند کار با دادهها را آسانتر و سریعتر میکند. شما نیازی به نوشتن کدهای پیچیده SQL ندارید و میتوانید به راحتی تغییرات در مدل دادههایتان را مدیریت کنید. این ابزار همچنین از انواع مختلف پایگاهدادهها پشتیبانی میکند، که این امر آن را به یک ابزار چندمنظوره تبدیل کرده است.