PDA

View Full Version : آموزش: آموزش Linq به صورت ساده



samadblaj
چهارشنبه 11 بهمن 1391, 15:02 عصر
به نام خدا ؛

سلام دوستان عزیز مدتی هست دارم از تکنولوژِی Linq استفاده میکنم...که واقعا از کارایی ، سهولت و سرعتش خیلی خوشم اومد بحث های زیادی در رابطه با این تکنولوژی ها شده و منابع زیادی برای استفاده از این تکنولوزی هست...

به نوبه خودم و قدردانی از دوستان برنامه نویس سعی کردم قسمتی از کد ها رو جمع و جور کنم و در این تاپیک قرار بدم امیدوارم بتونه کمکون کنه...


فقط عذر خواهی میکنم که نمیتونم از ابتدا براتون توضیح بدم چون منابع برای مقدمه زیاد هست
در پایان کتابی pdf پیوست کردم که از دوباره گویی این قسمت اجتناب میکنم


تمامی کد ها رو از تجربیات و یا کتابخونه Microsoft در تاپیک قرار میدم خوشحال میشم مشکلاتم و نواقص رو بهم گوش زد کنید...
به صورت تیکه تیکه کد ها رو قرار میدم و توضیح مختصری از کار هر کد فقط دوستان اگه در قسمتی از کار مشکل داشتد بهم اطلاع بدن تا کمکشون کنم...
و به زودی پیش میریم به سمت Entity Frameworke نسل جدید linq که کدها فرق چندانی با هم ندارند...


فقط خواهشا در این تاپیک پست انتقاد ، نظر پیشنهاد ، تشکر و سوال نزنید در صورت سوال تاپیک جدید یا از طریق پیغام خصوصی در خدمتم :تشویق:


در ابتدا توجه داشته باشید که کد های موجود در کلاس زیر است :

using System.Linq;

بدست آوردن کوچکترین عدد min


int[] numbers = { 5, 4,0, 1, 3, 9, 8, 6, 7, 2 };
int minNum = numbers.Min();
MessageBox.Show(minNum .ToString());


توضیح این کد : ابتدا یک آرایه از نوع اعداد صحیح تعریف کردیم و کوچکترین مقدار رو بدست آوردیم.
min متدی از کلاس linq هستش...
نکته مهم : برای سهولت نمایش مقدار از آرایه استفاده کردیم جای آرایه میشه مقداری یک جدول باشه...

بفرمایید به سادگی میتونید روی جدولتون ستون grade بزرگترین/گوچکترین نمره رو بدست بیارید
DataBaseEntities db=new DataBaseEntities ();

var queryMax = db.Table1.Min (d=>d.grade );
MessageBox.Show (queryMax.ToString ());

var queryMax = db.Table1.Max (d => d.grade); // "=>" این عبارت لامبادا هست که از توجه بالایی برخورداره
MessageBox.Show(queryMax.ToString());

مثال بالا فقط برای این بود که هم بر روی شی و دیتا به سادگی بتونید اطلاعات رو واکشی کنید...



نمایش تمامی مقادیر آریه (دوستان عزیز همونظور که گفتم مثل مثال بالا میتونید جای آرایه ستون های جدول رو قرار بدید که در قسمت های بعدی بیشتر روش تمرکز میکنیم )

string[] tools = { "samad", "reza", "moein"};

var list = from t in tools select t;
StringBuilder sb = new StringBuilder();
foreach (string s in list)
{
sb.Append(s + Environment.NewLine);
}
MessageBox.Show(sb.ToString());



نمایش تمامی حروفی که با s شروع شدن.

string[] str1 = { "samad", "ali", "saman", "reza", "sahand" };

var list =
from b in str1
where b.StartsWith("s")
select b;
StringBuilder sb = new StringBuilder();
foreach (string s in list)
{
sb.Append(s + Environment.NewLine);
}
MessageBox.Show(sb.ToString());



مثال دیگه : توی تکست ها میگرده و مقدار رو پیدا و نمایش میده.( فرضا برای جستجو یک کلمه در DataGridView) ببینید textbox کجا قرار گرفته ! فقط جای آرایه همه چیز میتونه باشه این فقط برای درک بهتر شماست....

string [] str1 ={textBox1 .Text ,textBox2 .Text ,textBox3 .Text };

var lin =
from s in str1
where s.StartsWith("s")
select s;
StringBuilder sb = new StringBuilder();
foreach (var l in lin)
{
sb.Append(l + Environment.NewLine);
}

MessageBox.Show(sb.ToString());



اولین کلمه ای که با کارکتر o شروع شده رو نمایش میدهد.

string[] strings = { "zero", "one", "two", "three"};

string startsWithO = strings.First(s => s[0] == 'o');
MessageBox.Show(startsWithO);



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

string [] str1={"samad","ali","reza"};
var listin=from s in str1 where s =="samad" select s;
StringBuilder sb=new StringBuilder ();
foreach (string s in listin)
{
sb.Append(s + Environment.NewLine);
}
MessageBox.Show(sb.ToString());




مرتب سازی

string[] str = { "samad", "ali", "reza" };

var list = from s in str orderby s ascending select s;
StringBuilder sb = new StringBuilder();
foreach (string s in list)
{
sb.Append(s + Environment.NewLine);
}
MessageBox.Show(sb.ToString());



نمایش اعداد کوچکتر از 5
int[] i = { 1, 5, 6, 2, 9, 1, 4 };

var news = from j in i
where j < 5
select j;

foreach (var m in news )
{
MessageBox.Show(m.ToString());
}




اضافه کردن یک رقم به اعداد موجود درآریه ها:

int[] number = { 5, 10, 7, 4, 3 };

var lin =
from n in number
select n + 1;
foreach (var i in lin)
{
MessageBox.Show(i.ToString());
}



نمایش دو آریه ی اول (خروجی : 5,6 )
int[] number = { 5, 6, 4, 2, 9 };

var lin = number.Take(2);
foreach (var k in lin)
{
MessageBox.Show(k.ToString());
}

دستور take() یک گزینه مناسب برای ساخت صفحات به صورت Paging هست...

نمایش از ایندکس آرایه مشخص (خروجی : 4,2,9 )

int[] number = { 5, 6, 4, 2, 9 };

var lin = number.Skip(2);
foreach (var k in lin)
{
MessageBox.Show(k.ToString());
}


تا قبل از مقدار مشخص (6)- آرایه ها رو نمایش میدهد

int[] number = { 5,1, 6, 4, 2, 9 };

var lin = number.TakeWhile(r => r < 6);
foreach (var k in lin)
{
MessageBox.Show(k.ToString());
}


بدست آرودن مجموع اعداد

int[] number = { 5, 8, 4, 9, 10 };

double sumlin = number.Sum();
MessageBox.Show(sumlin.ToString());



بدست آرودن مجموع کارکتر ها
string[] words = { "samad", "reza", "ali" };

double totalChars = words.Sum(w => w.Length);
MessageBox.Show(totalChars.ToString());



میانگین...
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

double averageNum = numbers.Average();
MessageBox.Show(averageNum.ToString());




مرتب سازی صعودی :
var sortedWords =
from w in words
orderby w
select w;


مرتب سازی بر اساس مقدار طول کلمه
var sortedWords =
from w in words
orderby w.Length
select w;


مرتب سازی بر اساس مقدار طول کلمه
var sortedWords =
from w in words
orderby w.Length
select w;
یا
var sortedDigits =
from d in digits
orderby d.Length, d
select d;

مرتب سازی نزولی اعشار (بیشترین سقف اعتبار)
double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };

var sortedDoubles =
from d in doubles
orderby d descending
select d;

foreach (var d in sortedDoubles)
{
Console.WriteLine(d);
}




تکرار کارکتر ( 7 را 10 بار تکرار می کند)
var numbers = Enumerable.Repeat(7, 10);

foreach (var n in numbers)
{
Console.WriteLine(n);
}

نمایش ایندکس مشخص :
int[] numbers = { 1, 4, 1, 3, 11, 9, 6, 7, 2, 0 };

int fourthLowNum = (
from n in numbers
where n > 5
select n)
.ElementAt(1);

Console.WriteLine( fourthLowNum);
Console.ReadLine();




اینم به عنوان پاورقی قرار میدم تا قسمت هایی رو که براتون گنگ هست رو بتونید بر طرف کنید... :چشمک:


Skip = به تعدادی مشخص از عنصر ها صرفه نظر می کنید.
Take = تعدادی از عناصر رو به عنوان خروجی بر می گردوند.
Select = عناصری رو که قرار است برگردونده شود رو بر می گرداند.
Contains = وجود عنصر مورد نظر رو بررسی میکند (بهترین گزینه برای جست و جو هستش :چشمک:)
Where = به شکلی شبیه به IF هست عناصر رو فیلتر میکند.


اگه دوستان دیگه هم منابع مناسبی برای آموزش دارند قرار بدن تا استفاده کنیم حتی یک تیکه کد !

کتاب پیوستی هم مقدمای بر استفاده از Linq هستش حتما مطالعه کنید.
سعی کنید خط به خط کد ها رو تست و تحلیل کنید کلید F1 هم فراموش نشه...

یا علی.

asghar2008
چهارشنبه 11 بهمن 1391, 15:22 عصر
سلام

ممنون از دوست گرامی بخاطر زحماتی که می کشیدو از تجربه های خودتون ما رو نیز بهره مند میکنید.

یه درخواست داشتم . ممنون میشم توجه کنید.

البته میدونم تالار #C هست. اما اگه امکانش هست کدهارو به زبان VB.Net نیز بنویسید.

ممنون.

samadblaj
چهارشنبه 11 بهمن 1391, 16:48 عصر
asghar2008 و یکی از دوستان دیگه درخواست تبدیل کد ها به زبان VB رو داشتند که انشاا... وقت کردم در اولین فرصت...

یکی از دوستان هم یکی پیشنهاد داشتند به نظر مناسب بود ... بیشتر دوستان با کپی پیست بیشتر حال میکنند تصمیم گرفتم قسمتی از کد ها رو به صورت عکس قرار بدم چون به نظرم بار اول حتما سعی کنید خودتون کد بزنید تا تحیلی و درک براتون ساده تر باشه...


خواهشا دیگه پست نزنید


ولی نیاز به سرویس آپلود هست همینطور یه کمی هم اذیت میکنه :لبخند:

samadblaj
چهارشنبه 11 بهمن 1391, 17:36 عصر
در این پست میخوام چند عمل اصلی رو بهتون نشون بدم سعی کردم به vb هم تبدیل کنم امیدوارم مشکلی نداشته باشه

در ابتدا یک مورد رو توضیح میدم دوستان گلم ببینید با توضیح مورد اول نیاز به توضیح برای قسمت های بعدی نیست چون از حوصله من خارج میشم...و سعی کنید فایل PDF پست اول رو حتما دانلود و استفاده کنید...
ببنید این پست هم از توجه بالایی برخورداره به صورت خلاصه اما بسیار کاربردی و مفید هستش...

این مثال ها از نوع Linq هستش به زودی همین مثال ها رو از روش Entity FrameWorke نسل جدید این تکنولوژی هم توی همین تاپیک قرار میدم پس دوتانی که تا اینجا از همین روش استفاده میکردند که هیچ ولی دوستانی که میخوان به تازگی شروع کنند منتظر پست های بعدیم باشند...


نام کلاس کاری linq در مثال های پایین MyDataContext هستش
نام جدول کاری هم customer است.


درج اطلاعات (Insert) :
MyDataContext db = new MyDataContext //جدول رو درون یک کلاس قرار دادیم و یک نمونه ازش ساختم
var customer = new Customer() { // دوباره یک نمونه از جدولمون ساختیم
//در قسمت زیر فیلد ها رو مقدار دهی کردیم
CustID = "ali",
CompanyName = "samad" }; //پایان

db.Customers.InsertOnSubmit(customer); //با کد زیر مقدار جدید رو به فیلد های جدول اضاف کردیم
db.SubmitChanges(); //و این خط هم تغییرات رو ذخیره میکند



بروز رسانی (ویرایش :لبخند: (Update))
customer.ContactName = "Samad";
customer.Location = null;
db.SubmitChanges();

حذ کردن (Delete) :
db.Customers.DeleteOnSubmit(customer);
db.SubmitChanges();


مثلا کد زیر رو براتون تشریح تر کردم :


نام کلاس کاری linq در مثال پایین DataBaseEntities هستش
نام جدول کاری هم Table1 است.

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

پس باید تصمیم بگیرید با یه کم خلاقیت اطلاعات رو صفحه بندی کنید ...
به عنوان مثلا از کل اطلاعات یه count (در بالا توضیح داده شد :چشمک:) میگیرید تقسیم بر 10 یا به تناسب اطلاعات میکنید و نمایش میدید متد skip و take هم در پست اول توضیح داده شد...

DataBaseEntities db = new DataBaseEntities();
var page3 = (from c in db.Table1
orderby c.grade descending
select c).Skip(2).Take(5);
dataGridView1.DataSource = page3;


این ک تقریبا به صورت Join میمونه...
این کد توی جدول Table1 در ستون name مقدار "samad" رو پیدا میکنه و مقدار فیلد نمره grade رو برای کاربر نمایش میده...
SingleOrDefault : یک عنصر که با شرط مطابقت داشته باشه رو برمیگردونه...
DataBaseEntities db = new DataBaseEntities();

var only = db.Table1.SingleOrDefault(c => c.name == "samad");
MessageBox.Show(only.grade.ToString());

این مقدار همونه فقط اولین مقدار رو بر میگردونه (متد بالا خیلی برای من کابرد داشته)
var only = db.Table1.FirstOrDefault (c => c.name == "ali");
MessageBox.Show(only.grade.ToString());


در کد زیر یه آرایه از کلمات رو به برنامه معرفی میکنیم جای این کلمات میتونه چند textbox باشه میگیم اگر samad یا ali پیدا شد در گرید نمایش بده فیلتر به شکلی مناسبتر است...

DataBaseEntities db = new DataBaseEntities();

var r = new string[] { "samad", "ali" };
var search = from c in db.Table1
where c is Table1 &&
(c.name == null || r.Contains(c.name ))
select c;
dataGridView1.DataSource = search;


اینم یکی از عمل های پر کاربرد و اصلی جهت واکشی و دریافت اطلاعات از چند جدول...

database : همون دیتابیسمون هستش.
Posts,Post_Metas : جدولامون هستند.
ID,Post_ID : کلید های متصل بههم جدول هامون

var query = database.Posts.Join(database.Post_Metas,
post => post.ID,
meta => meta.Post_ID,
(post, meta) => new { Post = post, Meta = meta });

موفق باشید./

Mosafers
چهارشنبه 10 دی 1393, 01:34 صبح
ممنونم حرف نداشت.........