6. Local variable
type inference
var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
Query
expressions
Lambda
expressions
var contacts =
customers
.Where(c => c.State == "WA")
.Select(c => new { c.Name, c.Phone });
Extension
methods
Anonymous
types
Object
initializers
7. public class List<T>
{
public List<T> Where(Func<T, bool> predicate) { … }
public List<S> Select<S>(Func<T, S> selector) { … }
…
}
List<Customer> customers = GetCustomerList();
List<string> contacts =
customers.Where(c => c.State == "WA").Select(c => c.Name);
Que pasa con
otros tipos?
Que pasa con los que
ya implementan IList?
Que pasa con
los arrays?
Operadores de
query son métodos
Componiendo
métodos
8. Query como
metodos estáticos
public static class Sequence
{
public static IEnumerable<T> Where<T>(IEnumerable<T> source,
Func<T, bool> predicate) { … }
public static IEnumerable<S> Select<T, S>(IEnumerable<T> source,
Func<T, S> selector) { … }
…
}
Hmmm…
Customer[] customers = GetCustomerArray();
IEnumerable<string> contacts = Sequence.Select(
Sequence.Where(customers, c => c.State == "WA"),
c => c.Name);
Sería bueno en
IEnumerable<T>
10. var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
var contacts =
customers
.Where(c => c.State == "WA")
.Select(c => new { c.Name, c.Phone });
Extension
methods
Query
expressions
11. int i = 5;
string s = "Hello";
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary<int,Order> orders = new Dictionary<int,Order>();
var i = 5;
var s = "Hello";
var d = 1.0;
var numbers = new int[] {1, 2, 3};
var orders = new Dictionary<int,Order>();
12. Local variable
type inference
var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
var contacts =
customers
.Where(c => c.State == "WA")
.Select(c => new { c.Name, c.Phone });
13. public class Point
{
private int x, y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
Point a = new Point { X = 0, Y = 1 };
Point a = new Point();
a.X = 0;
a.Y = 1;
Asignar campos
o propiedades
15. var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
var contacts =
customers
.Where(c => c.State == "WA")
.Select(c => new { c.Name, c.Phone });
Object
initializers
16. public class Customer
{
public string Name;
public Address Address;
public string Phone;
public List<Order> Orders;
…
}
public class Contact
{
public string Name;
public string Phone;
}
Customer c = GetCustomer(…);
Contact x = new Contact { Name = c.Name, Phone = c.Phone };
Customer c = GetCustomer(…);
var x = new { Name = c.Name, Phone = c.Phone };
Customer c = GetCustomer(…);
var x = new { c.Name, c.Phone };
17. var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
var contacts =
customers.
.Where(c => c.State == "WA“)
.Select(c => new { c.Name, c.Phone });
foreach (var c in contacts) {
Console.WriteLine(c.Name);
Console.WriteLine(c.Phone);
}
18. var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
var contacts =
customers
.Where(c => c.State == "WA")
.Select(c => new { c.Name, c.Phone });
Anonymous
types
19. C# 3.0
VB 9.0
Others…
.NET Language Integrated Query
Standard
Query
Operators
Linq to Sql
(ADO.NET)
XLinq
(System.Xml)
<book>
<title/>
<author/>
<year/>
<price/>
</book>
Objects
SQL
XML
20. class Contact { … };
List<Contact> contacts = new List<Contacts>();
foreach(Customer c in customers)
{
if(c.State == “WA”)
{
Contact ct = new Contact();
ct.Name = c.Name;
ct.Phone = c.Phone;
contacts.Add(ct);
}
}
var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
31. • Mejorar la forma de procesar Xml
Creando nuevas instancias
Modificando instancias existentes
Consultando instancias en memoria
Combinando consultas entre Xml, Objetos y Datos
34. XElement
new XElement "contacts"
new XElement "contact"
new XElement "name" "Patrick Hines"
new XElement "phone" "206-555-0144"
new XAttribute "type" "home"
new XElement "phone" "425-555-0145"
new XAttribute "type" "work"
new XElement "address"
new XElement "street1" "123 Main St"
new XElement "city" "Mercer Island"
new XElement "state" "WA"
new XElement "postal" "68042"
35. var result = new XElement "contacts"
from
in
"contact"
select new
new XComment "contact"
new XElement "name"
string
"name"
"phone"
new XElement "address"
"address"
36.
37. • Basado en un modelo conceptual
Entity y EntitySet
• Se mapea con el modelo relacional de la base de datos
permitiendo abarcar mas escenarios.