۱۴ مطلب با کلمهی کلیدی «آموزش linq در c#» ثبت شده است
تغییر خروجی یک دستور کوئری در لینک
بسم الله الرحمن الرحیم
آموزش select new در LINQ
در بسیاری از کوئری های LINQ ما نیاز خواهیم داشت، تا نتیجه ی کوئری را به کلاس دیگری Bind کنیم برای این کار مثالی را در این جا بررسی خواهیم کرد.
بر روی یک Table کوئریی را می خواهیم اجرا کنیم، در این کوئری فقط فیلدهای Id , Name را لازم خواهیم داشت، این دو فیلد را باید تبدیل به یک کلاس دیگر کنیم.
برای اینکار کد ما به صورت زیر خواهد بود:
class ProjectInfo
{
public string Name {get; set; }
public long Id {get; set; }
}
public List<ProjectInfo> GetProjectForCombo()
{
using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
{
var query = from pro in db.Projects
select new ProjectInfo(){ Name = pro.ProjectName, Id = pro.ProjectId };
return query.ToList();
}
}
ادامه مطلب...
تفاوت دستور Select با SelectMany در LINQ
بسم الله الرحمن الرحیم
تفاوت دستور Select با SelectMany در LINQ
می توانید مقاله آموزش Linq به زبان فارسی را از این قسمت مشاهده کنید.
دو عملگر Select و SelectMany عملگر های projection هستند. عملگر Select برای انتخاب مقادیر از یک مجموعه است اما عملگر SelectMany برای انتخاب مقادیر یک مجموعه از مجموعه دیگر است.
اپراتور یا عملگر Select یک مقدار را به عنوان خروجی به شما می دهد در صورتی که SelectMany یک خروجی شامل مقادیری مرتبط به یکدیگر را به شما ارائه می دهد.
عملا، عملگر SelectMany یک IEnumerable<IEnumerable<T>> در IEnumrable<T> ایجاد می کند. اینطور می توان گفت که، یک لیست که خود این لیست هر عنصرش یک لیست است را از یک مجموعه ایجاد می کند.
اضافه کردن متد به LINQ
بسم الله الرحمن الرحیم
می خواهیم به تمامی لیست هایی که از نوع double ایجاد می شوند یک متد برای پیدا کردن عنصر میانی آنها بنویسیم
public static class LINQExtension
{
public static double Median(this IEnumerable<double> source)
{
if (source.Count() == 0)
{
throw new InvalidOperationException("Cannot compute median for an empty set.");
}
var sortedList = from number in source
orderby number
select number;
int itemIndex = (int)sortedList.Count() / 2;
if (sortedList.Count() % 2 == 0)
{
// Even number of items.
return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2;
}
else
{
// Odd number of items.
return sortedList.ElementAt(itemIndex);
}
}
}
ادامه مطلب...
Linq extension method
بسم الله الرحمن الرحیم
می خواهیم یک Extesion Method مانند متدهای Linq برای Model ایی خاص بنویسیم.
دو نکته را برای نوشتم متدهای توسعه (Extension Method) باید رعایت کنید:
1- متد را باید در کلاسی بنویسید که از نوع static باشد
2- namespace شما باید با namespace کلاسی که می خواهید برای آن Extension Method بنویسید یکسان باشد
ما می خواهیم وقتی از شی DbContext مدل Active را انتخاب می کنیم مانند متد ()FirstOrDefault لینک (LINQ) یک متد برای اجرای یک دستور خاص نمایش داده شود:
public static class Extensions
{
public IQueryable<T> Active<T>(this IQueryable<T> source)
where T : YourEntityType
{
return source.Where(a => ((a.publishEnd > DateTime.Now) || (a.publishEnd == null))
&& ((a.publishStart <= DateTime.Now) || (a.publishStart == null))
&& a.active == true);
}
}
برای فراخوانی متد به صورت زیر می توانیم عمل کنیم:
var item = db.myTable.Active().SingleOrDefault(...);
برطرف کردن مشکل LINQ to Entities does not recognize
بسم الله الرحمن الرحیم
Server Error in '/' Application.
LINQ to Entities does not recognize the method 'EduOnline' method, and this method cannot be translated into a store expression.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
این خطا زمانی رخ می دهد که شما می خواهید یک دستور مشابه دستور زیر اجرا کنید:
db.Accounts.Where(m => m.AccountType == Enum.AccountTypes.Admin
برای حل این مشکل کافی است که کد خود را به صورت یک عبارت مشخص قابل بررسی توسط LINQ تبدیل کنید، مثلا در اینجا می توانید به صورت زیر و خیلی ساده کد خود را بنویسید و مشکل خود را حل نمایید:
db.Accounts.Where(m => m.AccountType == (int)Enum.AccountTypes.Admin)
در اینجا شما با تبدیل عبارت خود به یک به عبارت قابل مقایسه برای LINQ این مشکل را حل کرده اید
کوئری با تاخیر
بسم الله الرحمن الرحیم
آموزش لینک
در بخش های آموزش Linq در مورد کوئری های با تاخیر به صورت مختصر صحبت شد اما برای درک بهتر نیاز دیدم تا یک مثال را بررسی کنیم تا در صورتی که مطلب کاملا روشن نشده است در اینجا به طور کامل مشخص گردد.
این مثال در نظر بگیرید:
int[] price = new int{6500,5000,7800,9000,4800};
var result= price.Order().Take(3);
price[5]=999999;
foreach(var p in result)
{
Console.WriteLine(p);
}
ادامه مطلب...
آموزش Linq (بخش هشتم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش هشتم
LINQ
در این بخش تگ های تبدیل لینک را آموزش خواهم داد
Conversion Operators
cast
عناصر مجموعه را به یک نوع مشخص تبدیل می کند
ArrayList list = new ArrayList { 1, 3, 2, 3, 1, 8, 13 };
IEnumerable<int> query = list.Cast<int>();
foreach (int i in query)
Console.WriteLine(i);
//output
//1
//3
//2
//3
//3
//1
//8
//13
ادامه مطلب...
آموزش Linq (بخش هفتم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش هفتم
LINQ
در این بخش تگ های اتصال لینک را آموزش خواهم داد
Join operators
join
برای متصل کردن دو شی یه یکدیگر از متد join استفاده می کنیم. مثال:
var query = from c in customers join o in orders on c.CustomerID equals o.CustomerID
select new {FullName = c.Name + " " +
c.Family ,
c.CustomerID ,
o.OrderDate ,
TotalOrder = o.Total
};
ادامه مطلب...
آموزش Linq (بخش ششم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش ششم
LINQ
در این بخش تگ های انتخابی لینک را آموزش خواهم داد
Element opertators
ElementAt
عنصر واقع در یک اندیس مشخص شده در یک مجموعه را برمی گرداند.
var query = SampleList.ElementAt(4);
ElementAtOrDefault
عنصر واقع در یک اندیس مشخص در یک مجموعه را برمی گرداند و یا اگر اندیس خارج از دامنه باشد یک مقدار پیش فرض را برمی گرداند.
ادامه مطلب...آموزش Linq (بخش پنجم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش پنجم
LINQ
در این بخش تگ های تولیدی لینک را آموزش خواهم داد
Generation Empty
Range
مجموعه ای را تولید می کند که حاوی دنباله ای از اعداد است مثال:
// Generate a sequence of integers from 1 to 10
// and then select their squares.
IEnumerable squares = Enumerable.Range(1, 10).Select(x => x * x);
foreach (int num in squares)
Console.WriteLine(num);
/*
This code produces the following output:
1
4
9
16
25
36
49
64
81
100
*/
ادامه مطلب...
آموزش Linq (بخش چهارم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش چهارم
LINQ
در این بخش عملگرهای کمیت سنج و عملگر های دسته بندی را معرفی خواهم کرد
Quantifier
All
تمام عناصر یک مجموعه را بررسی و در صورت صحیح بودن شرط برای همه مقادیر، مقدار true بر می گرداند.
List<int> SampleList1 = new List<int>() { 1, 3, 2, 3, 1, 8, 13 };
bool query = SampleList1.All( c => ((c % 2) == 0));
Console.WriteLine(query);
//output
//False
ادامه مطلب...
آموزش Linq (بخش سوم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش سوم
LINQ
در این بخش تگ های دسته بندی لینک را آموزش خواهم داد
Group By
در بعضی پرس و جو ها شما نیاز دارید که نتیجه را به صورت گروه بندی نمایش دهید برای گروه بندی باید به صورت زیر عمل کنید:
var queryCustomersByCity = from cust in customers group cust by cust.City;
یا
var query = from c in customers group c by c.Country into cc select new { Country = cc.Key };
فکر کنم نیازی به توضیح نیست با استفاده از متغییر دامنه ما تعیین می کنیم که بر اساس چه فیلدی گروه بندی شود در اینجا ما بر اساس شی مشتری که فیلد شهر را دارد گروه بندی می کنیم.
اگر بخواهیم به نتیجه گروه بندی دسترسی داشته باشیم باید از عبارتinto استفاده کنیم. مثال:
var custQuery = from cust in customers group cust by cust.City into custGroup where custGroup.Count() >2 orderby custGroup.Key select custGroup;
ادامه مطلب...
آموزش Linq (بخش دوم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش دوم
LINQ
در این بخش عملگرهای استاندارد و اصلی لینک به همراه توابع تجمعی را آموزش خواهم داد.
منباب اطلاع: شما با استفاده از لینک می توانید بر روی نوع های جنریک های مختلف کوئری بزنید مثال:
IEnumerable<Customer> customerQuery = from cust in customers where cust.City == "London" select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
بحثی در لینک وجود دارد به نام اجرای با تعویق، در واقع به این معنی است که هنگامی که شما یک دستور لنیک را می نویسید آن را فقط ایجاد می کنید و وقتی آن را با foreach می خوانید در آن زمان اجرا می کنید. متغییر پرس وجو هرگز نتایج را نگهداری نمی کند یعنی اگر شما یک دستور را بر روی پایگاه داده اجرا کنید و پایگاه داده دائما تغییر کند نتایج شما هم به ازای هر بار اجرا شدن (منظور از اجرا شدن مثلا همان دستور foreach است) نتایج متفاوتی خواهد داشت.
بعضی دستورات لینک صریحا اجرا می شوند مثل First و Average ،Max ،Count چون باید اجرا شوند تا بتوانند نتیجه را مشخص کنند و این نوع دستورات یک مقدار بر می گرداند به این عملگر ها، عملگرهای تجمعی می گویند.
ادامه مطلب...آموزش Linq (بخش اول)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش اول
LINQ
در این بخش قصد دارم به معرفی LINQ بپردازم و آن را به صورت مختصر و درحین حال کامل آموزش دهم
همان طور که می دانید شما برای گرفتن کوئری و به عبارتی پرس و جو بر روی منبع های مختلف مثل XML,SQL و ... نیاز به آموزش زبان های مختلف دارید که مشکل بسیار بزرگی است راه حل ارائه گردیده استفاده از زبانی است که از همه این منبع ها پشتیبانی نماید. لینک در VS2008 و .Net 3.5 ارائه گردید و linq مخفف عبارت Language Integrated Query است.
برای تئوری همین کافی است.
لطفا از این پس LINQ را لینک تلفظ نمایید.
در اجرای دستورات لینک سه بخش مورد استفاده است:
- منبع داده
- پرس و جو
- اجرا
مثال:
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
var numQuery = from num in numbers where (num % (0 == 2 select num;
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
ادامه مطلب...