مشخصات مقاله
-
1172
-
0.0
-
2660
-
0
-
0
آموزش تبدیل داده ها با LINQ
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
تبدیل داده ها با LINQ
LINQ تنها به منظور بازیابی اطلاعات بکار نمی رود، بلکه وسیله ی کارآمد و قدرتمندی است که توسط آن می توان داده ها را تبدیل کرد. با استفاده از کوئری های LINQ، می توانید یک دنباله یا مجموعه (منبع داده همچون آرایه) را به عنوان ورودی بگیرید و آن را به روش های مختلف ویرایش نموده و سپس یک نسخه ی ویرایش شده از منبع را به عنوان خروجی برگردانید. می توانید خود دنباله (منبع داده) را بدون ویرایش المان های آن اصلاح کرد. این کار از طریق گروه بندی و مرتب سازی صورت می پذیرد. اما به عنوان قدرتمندترین امکان LINQ می توان به قابلیت ایجاد نوع های جدید اشاره کرد. عملیات ایجاد نوع های جدید توسط عبارت select پیاده سازی می شود. به عنوان مثال می توان:
1. چندین دنباله یا منبع داده را در قالب یک خروجی واحد که دارای نوع جدید می باشد، ادغام (merge) کرد.
2. ایجاد دنباله هایی به عنوان خروجی که المان های آن از یک یا چند property متعلق به هر یک از المان های منبع داده (دنباله) تشکیل شده است.
3. ایجاد دنباله هایی به عنوان خروجی که المان های تشکیل دهنده آن حاوی نتایج عملیات اجرا شده بر روی منبع داده باشد.
4. ارائه ی خروجی دنباله ها به فرمت های مختلف. برای مثال، می توانید داده ها را از قالب سطرها یا فایل های متنی SQL به فرمت XML تبدیل نمایید.
موارد ذکر شده تنها تعدادی نمونه از قابلیت های گسترده ی LINQ هستند. البته، این عملیات تبدیل را می توان به روش های مختلف انجام داده و داخل کوئری یکسان، ترکیب کرد. بعلاوه، دنباله ای که به عنوان خروجی ارائه می شود را می توان به مثابه ی ورودی برای کوئری دیگر بکار برد.
ادغام چندین ورودی و گنجاندن آن در قالب خروجی واحد
می توان یک کوئری LINQ را برای ایجاد یک دنباله به عنوان خروجی بکار برد که دربرگیرنده ی چندین المان از چندین منبع داده (input sequence) مختلف می باشد. مثال زیر نحوه ی ترکیب دو data structure مقیم در حافظه را نمایش می دهد (گفتنی است که همین اصول را می توان برای ترکیب داده ها از XML، SQL یا DataSet ها بکار برد). دو کلاس زیر را در نظر داشته باشید:
class Student
{
public string First { get; set; }
public string Last {get; set;}
public int ID { get; set; }
public string Street { get; set; }
public string City { get; set; }
public List<int> Scores;
}
class Teacher
{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public string City { get; set; }
}
کوئری:
class DataTransformations
{
static void Main()
{
// Create the first data source.
List
{
new Student {First="Svetlana",
Last="Omelchenko",
ID=111,
Street="123 Main Street",
City="Seattle",
Scores= new List<int> {97, 92, 81, 60}},
new Student {First="Claire",
Last="O’Donnell",
ID=112,
Street="124 Main Street",
City="Redmond",
Scores= new List<int> {75, 84, 91, 39}},
new Student {First="Sven",
Last="Mortensen",
ID=113,
Street="125 Main Street",
City="Lake City",
Scores= new List<int> {88, 94, 65, 91}},
};
// Create the second data source.
List
{
new Teacher {First="Ann", Last="Beebe", ID=945, City = "Seattle"},
new Teacher {First="Alex", Last="Robinson", ID=956, City = "Redmond"},
new Teacher {First="Michiyo", Last="Sato", ID=972, City = "Tacoma"}
};
// Create the query.
var peopleInSeattle = (from student in students
where student.City == "Seattle"
select student.Last)
.Concat(from teacher in teachers
where teacher.City == "Seattle"
select teacher.Last);
Console.WriteLine("The following students and teachers live in Seattle:");
// Execute the query.
foreach (var person in peopleInSeattle)
{
Console.WriteLine(person);
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
The following students and teachers live in Seattle:
Omelchenko
Beebe
*/
انتخاب زیرمجموعه ای از هر المان منبع داده
دو روش اصلی برای انتخاب زیرمجموعه ای از هر المان موجود در منبع داده (source element) وجود دارد که به شرح زیر می باشد:
1. به منظور انتخاب تنها یکی از اعضای المان منبع (source element)، کافی است از عملگر نقطه (dot operation) استفاده کنید. در مثال زیر، فرض بگیرید که یک شی Customer حاوی چندین property با سطح دسترسی public از جمله یک رشته به نام City می باشد. پس از اجرا، این کوئری یک دنباله از نوع رشته به عنوان خروجی تولید می کند:
var query = from cust in Customers
2. جهت ایجاد المان هایی که دربرگیرنده ی چندین property از المان منبع می باشد، می توانید یک object initializer (ایجاد شی جدید با استفاده از کلیدواژه ی new) با شی نام گذاری شده (استفاده از) یا یک متغیر از نوع ناشناس (anonymous type) بکار ببرید. مثال زیر استفاده از نوع ناشناس برای کپسوله سازی دو property از هر شی Customer را نمایش می دهد:
var query = from cust in Customer
select new {Name = cust.Name, City = cust.City};
تبدیل اشیا مقیم در حافظه به XML
کوئری های LINQ تبدیل داده از data structure های مقیم در حافظه (به عنوان مثال دو کلاس Student و Teacher)، پایگاه های داده SQL، Dataset های ADO.NET و فایل های XML را آسان ساخته است. مثال زیر اشیا مقیم در حافظه را که به data structure خاص تعلق دارند، به فرمت (المان های) XML تبدیل می کند.
class XMLTransform
{
static void Main()
{
// Create the data source by using a collection initializer.
// The Student class was defined previously in this topic.
List
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores = new List<int>{97, 92, 81, 60}},
new Student {First="Claire", Last="O’Donnell", ID=112, Scores = new List<int>{75, 84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores = new List<int>{88, 94, 65, 91}},
};
// Create the query.
var studentsToXML = new XElement("Root",
from student in students
let x = String.Format("{0},{1},{2},{3}", student.Scores[0],
student.Scores[1], student.Scores[2], student.Scores[3])
select new XElement("student",
new XElement("First", student.First),
new XElement("Last", student.Last),
new XElement("Scores", x)
) // end "student"
); // end "Root"
// Execute the query.
Console.WriteLine(studentsToXML);
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
کد بالا خروجی XML زیر را تولید می کند:
< Root>
اجرای عملیات برای المان های منبع داده
یک دنباله که به عنوان خروجی ارائه می شود ممکن است هیچ المان یا property ای از منبع داده را دربردنداشته باشد. خروجی ممکن است دنباله ای از مقادیر باشد که با استفاده از المان های منبع داده به عنوان آرگومان ورودی صورت بپذیرد. کوئری ساده ی زیر، پس از اجرا، یک دنباله از رشته ها را به عنوان خروجی برمی گرداند که مقادیر آن نمایشگر محاسبه ای بر اساس المان های منبع داده است که نوع آن منبع داده double می باشد.
نکته: اگر قرار است که query به domain دیگری تبدیل شود، در آن صورت فراخوانی متد در عبارت (دستور) query امکان پذیر نخواهد بود. به عنوان مثال، نمی توان متدهای متعارف C# را در LINQ to SQL فراخوانی نمود زیرا SQL Server بستری برای اجرای آن ندارد. به منظور رفع این مشکل می توانید stored procedure ها را به متدها نگاشت کرده و آن ها را صدا بزنید.
class FormatQuery
{
static void Main()
{
// Data source.
double[] radii = { 1, 2, 3 };
// Query.
IEnumerable<string> query =
from rad in radii
select String.Format("Area = {0}", (rad * rad) * 3.14);
// Query execution.
foreach (string s in query)
Console.WriteLine(s);
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Area = 3.14
Area = 12.56
Area = 28.26
*/