Download - LINQ Project

Transcript
Page 1: LINQ Project

LINQ Project.NET Language Integrated

QueryHubert Górniak

Page 2: LINQ Project

Plan prezentacji

WstępPomysł na LINQProsty przykładLambda expressionsInicjalizacja złożonych wartościIntegracja z SQL (DLinq)Podsumowanie

Page 3: LINQ Project

Wstęp

LINQ definiuje standardowe operatory kwerend

Umożliwia językom filtrowanie, enumeracje i tworzenie projekcji różnych kolekcji używając tej samej składni

Page 4: LINQ Project

Pomysł na LINQ

Programując obiektowo używamy klas, obiektów i metod

Używamy informacji z różnych źródełLINQ to uproszczenie i ujednolicenie

dostępu i integracji do informacji nieobiektowej

Najczęściej do relacyjnych baz danych i plików XML

Page 5: LINQ Project

Pomysł na LINQ

Zamiast dodawać relacyjne lub XML’ owe właściwości do naszych programów używamy ułatwień w postaci ogólnych kwerend

Page 6: LINQ Project

Prosty przykład Używając standardowych operatorów kwerend w C# 3.0:using System;using System.Query;using System.Collections.Generic;class app {

static void Main() {string[] names = { "Burke", "Connor",

"Frank", "Everett", "Albert", "George", "Harris", "David" };

IEnumerable<string> expr = from s in names where s.Length == 5

orderby s select s.ToUpper();

foreach (string item in expr) Console.WriteLine(item);

}} Po przetworzeniu tablicy otrzymujemy:BURKE DAVID FRANK

Page 7: LINQ Project

Prosty przykład

Inicjalizacja zmiennej przez query expression Query expression przetwarza jedno lub wiele

źródeł danych używając różnych query operators

Wyrażenie w przykładzie używa operatorów: Where OrderBy Select

Wyrażenie napisane jest w query syntax

Page 8: LINQ Project

Prosty przykład

Możliwe jest zapisanie wyrażenie w składni z „.”

IEnumerable<string> expr = names.Where(s => s.Length == 5).OrderBy(s => s).Select(s => s.ToUpper());

Argumenty operatorów nazywane są lambda expressions

Page 9: LINQ Project

Lambda expressions

Operatory umożliwiają użycie funkcji jako argumentów

Func<string, bool> filter = s => s.Length == 5;Func<string, string> extract = s => s;Func<string, string> project = s => s.ToUpper();

IEnumerable<string> expr = names.Where(filter).OrderBy(extract).Select(project);

Page 10: LINQ Project

Lambda expressions

Podobne do metod anonimowych

Func<string, bool> filter = delegate (string s) {return s.Length == 5;

};Func<string, string> extract = delegate (string s) {

return s;}; Func<string, string> project = delegate (string s) {

return s.ToUpper();};

Page 11: LINQ Project

Inicjalizacja złożonych wartościZakładając że dany jest typ:public class Person { string name; int age; bool canCode; public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public bool CanCode { get { return canCode; } set { canCode = value; } }}

Person value = new Person { Name = "Chris Smith", Age = 31, CanCode = false};

Możemy dokonać inicjalizacji w następujący sposób:

Page 12: LINQ Project

Integracja z SQL (DLinq)

Możliwość tworzenia zapytań do relacyjnych źródeł

W środowisku projektowymAtrybuty [Table] i [Column] definiują typy

CLR odpowiadające definicjom SQL Schema

Page 13: LINQ Project

Integracja z SQL (DLinq)

Możliwość tworzenia zapytań do relacyjnych źródeł

Page 14: LINQ Project

Integracja z SQL (DLinq)

Przykładowa definicja SQL:create table People ( Name nvarchar(32) primary key not null, Age int not null, CanCode bit not null)create table Orders ( OrderID nvarchar(32) primary key not null, Customer nvarchar(32) not null, Amount int)

Page 15: LINQ Project

Integracja z SQL (DLinq)

Jedyne czego potrzebujemy to:[Table(Name="People")]public class Person { [Column(DbType="nvarchar(32) not null", Id=true)] public string Name; [Column] public int Age; [Column] public bool CanCode;}[Table(Name="Orders")]public class Order { [Column(DbType="nvarchar(32) not null", Id=true)] public string OrderID; [Column(DbType="nvarchar(32) not null")] public string Customer; [Column] public int? Amount; }

Page 16: LINQ Project

Integracja z SQL (DLinq)

Aby móc korzystać z mocy DLinq// tworzymy zapytanievar query = from c in custs from o in orders where o.Customer == c.Name select new { c.Name, o.OrderID, o.Amount, c.Age };// i wywolujemyforeach (var item in query) Console.WriteLine("{0} {1} {2} {3}", item.Name, item.OrderID, item.Amount, item.Age);

Page 17: LINQ Project

Podsumowanie

Linq prezentuje ciekawe podejście do przetwarzania nieobiektowych danych