4. LINQ to SQL
4.1. Giới thiệu
XML namespace giúp tránh xung đột giửa các bộ phận khác nhau của một tài liệu XML. khi khai báo một namespace, bạn chọn một tên cục bộ sao cho nó là duy nhất.
Những tiền tố làm cho tài liệu XML súc tích và dễ hiểu hơn.
Một trong những lợi thế khi sử dụng LINQ to XML với C# là đơn giản hóa những XML name là loại bỏ những thủ tục mà những nhà phát triễn sử dụng tiền tố. khi LINQ load hoặc parse một tài liệu XML, mỗi tiền tố sẽ được xử lý để phù hợp với namespace XML. khi làm việc với tài liệu có namespace, bạn thường truy cập namespace thông qua namespace URI, không thông qua tiền tố namespace.
27
3.4.2. Tạo một namespace trong cây XML
Ví dụ:
C#
// Create an XML tree in a namespace, with a specified prefix XNamespace aw = "http://www.adventure-works.com"; XElement root = new XElement(aw + "Root",
new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"), new XElement(aw + "Child", "child content")
); Console.WriteLine(root); Xml <aw:Root xmlns:aw="http://www.adventure-works.com"> <aw:Child>child content</aw:Child> </aw:Root>
3.4.3. Điều khiển tiền tố namespace trong cây XML
Ví dụ sau khai báo hai tiền tố namespace. Tên miền
“http://www.adventure-works.com” có tiền tố “aw”, và “www.fourthcoffee.com”
có tiền tốfc.
C#
XNamespace aw = "http://www.adventure-works.com"; XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
28 new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
new XElement(fc + "Child",
new XElement(aw + "DifferentChild", "other content") ),
new XElement(aw + "Child2", "c2 content"), new XElement(fc + "Child3", "c3 content") );
Console.WriteLine(root);
Xml
<aw:Root xmlns:aw="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com"> <fc:Child> <aw:DifferentChild>other content</aw:DifferentChild> </fc:Child> <aw:Child2>c2 content</aw:Child2> <fc:Child3>c3 content</fc:Child3> </aw:Root>
3.4.4. Viết truy vấn LINQ trong namespace
Ví dụ:
C#
XNamespace aw = "http://www.adventure-works.com"; XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'> <Child>1</Child>
29 <Child>3</Child> <AnotherChild>4</AnotherChild> <AnotherChild>5</AnotherChild> <AnotherChild>6</AnotherChild> </Root>"); IEnumerable<XElement> c1 =
from el in root.Elements(aw + "Child") select el; foreach (XElement el in c1) Console.WriteLine((int)el); 1 2 3
3.5. Những thao tác truy vấn cơ bản trên cây XML 3.5.1. Tìm một phần tử trong cây XML 3.5.1. Tìm một phần tử trong cây XML
Xét ví dụ sau tìm phần tử Address có thuộc tính Type có giá trị là "Billing".
C#
XElement root = XElement.Load("PurchaseOrder.xml"); IEnumerable<XElement> address =
from el in root.Elements("Address")
where (string)el.Attribute("Type") == "Billing" select el;
30 foreach (XElement el in address)
Console.WriteLine(el);
Xml
<Address Type="Billing"> <Name>Tai Yee</Name> <Street>8 Oak Avenue</Street> <City>Old Town</City> <State>PA</State> <Zip>95819</Zip> <Country>USA</Country> </Address> 3.5.2. Lọc phần tử trong cây XML
Ví dụ sau lọc những phần tử có phần tử con <Type > có Value="Yes".
C#
XElement root = XElement.Parse(@"<Root> <Child1>
<Text>Child One Text</Text> <Type Value=""Yes""/> </Child1>
<Child2>
<Text>Child Two Text</Text> <Type Value=""Yes""/> </Child2>
31 <Child3>
<Text>Child Three Text</Text> <Type Value=""No""/>
</Child3> <Child4>
<Text>Child Four Text</Text> <Type Value=""Yes""/> </Child4>
<Child5>
<Text>Child Five Text</Text> </Child5>
</Root>"); var cList =
from typeElement in root.Elements().Elements("Type") where (string)typeElement.Attribute("Value") == "Yes" select (string)typeElement.Parent.Element("Text"); foreach(string str in cList)
Console.WriteLine(str);
Child One Text Child Two Text Child Four Text
3.5.3. Sắp xếp các phần tử trong cây XML
C#
32 IEnumerable<decimal> prices =
from el in root.Elements("Data") let price = (decimal)el.Element("Price") orderby price
select price;
foreach (decimal el in prices) Console.WriteLine(el); 0.99 4.95 6.99 24.50 29.00 66.00 89.99 3.5.4. Kết hai cây XML
Ví dụ sau kết những phần tử Customer với những phần tử Order , và tạo ra tài liệu XML mới gồm phần tử CompanyName bên trong order.
C#
XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add("", "CustomersOrders.xsd");
Console.Write("Attempting to validate, ");
33 bool errors = false;
custOrdDoc.Validate(schemas, (o, e) => {
Console.WriteLine("{0}", e.Message); errors = true;
});
Console.WriteLine("custOrdDoc {0}", errors ? "did not validate" : "validated");
if (!errors) {
// Join customers and orders, and create a new XML document with // a different shape.
// The new document contains orders only for customers with a // CustomerID > 'K'
XElement custOrd = custOrdDoc.Element("Root"); XElement newCustOrd = new XElement("Root",
from c in custOrd.Element("Customers").Elements("Customer") join o in custOrd.Element("Orders").Elements("Order")
on (string)c.Attribute("CustomerID") equals (string)o.Element("CustomerID")
where ((string)c.Attribute("CustomerID")).CompareTo("K") > 0 select new XElement("Order",
new XElement("CustomerID", (string)c.Attribute("CustomerID")), new XElement("CompanyName", (string)c.Element("CompanyName")), new XElement("ContactName", (string)c.Element("ContactName")),
34 new XElement("EmployeeID", (string)o.Element("EmployeeID")),
new XElement("OrderDate", (DateTime)o.Element("OrderDate")) )
);
Console.WriteLine(newCustOrd); }
Attempting to validate, custOrdDoc validated <Root>
<Order>
<CustomerID>LAZYK</CustomerID>
<CompanyName>Lazy K Kountry Store</CompanyName> <ContactName>John Steel</ContactName> <EmployeeID>1</EmployeeID> <OrderDate>1997-03-21T00:00:00</OrderDate> </Order> <Order> <CustomerID>LAZYK</CustomerID>
<CompanyName>Lazy K Kountry Store</CompanyName> <ContactName>John Steel</ContactName> <EmployeeID>8</EmployeeID> <OrderDate>1997-05-22T00:00:00</OrderDate> </Order> <Order> <CustomerID>LETSS</CustomerID>
35 <CompanyName>Let's Stop N Shop</CompanyName>
<ContactName>Jaime Yorres</ContactName> <EmployeeID>1</EmployeeID> <OrderDate>1997-06-25T00:00:00</OrderDate> </Order> <Order> <CustomerID>LETSS</CustomerID>
<CompanyName>Let's Stop N Shop</CompanyName> <ContactName>Jaime Yorres</ContactName> <EmployeeID>8</EmployeeID> <OrderDate>1997-10-27T00:00:00</OrderDate> </Order> <Order> <CustomerID>LETSS</CustomerID>
<CompanyName>Let's Stop N Shop</CompanyName> <ContactName>Jaime Yorres</ContactName> <EmployeeID>6</EmployeeID> <OrderDate>1997-11-10T00:00:00</OrderDate> </Order> <Order> <CustomerID>LETSS</CustomerID>
<CompanyName>Let's Stop N Shop</CompanyName> <ContactName>Jaime Yorres</ContactName>
<EmployeeID>4</EmployeeID>
<OrderDate>1998-02-12T00:00:00</OrderDate> </Order>
36 </Root>
3.5.5. Nhóm các phần tử trong một cây XML
Ví dụ nhóm dữ liệu theo loại, sau đó tạo ra một tập tin XML mới, trong đó phân
cấp XML theo nhóm.
C#
XElement doc = XElement.Load("Data.xml"); var newData =
new XElement("Root",
from data in doc.Elements("Data")
group data by (string)data.Element("Category") into groupedData select new XElement("Group",
new XAttribute("ID", groupedData.Key), from g in groupedData
select new XElement("Data", g.Element("Quantity"), g.Element("Price") ) ) ); Console.WriteLine(newData); Xml <Root> <Group ID="A"> <Data> <Quantity>3</Quantity> <Price>24.50</Price>
37 </Data> <Data> <Quantity>5</Quantity> <Price>4.95</Price> </Data> <Data> <Quantity>3</Quantity> <Price>66.00</Price> </Data> <Data> <Quantity>15</Quantity> <Price>29.00</Price> </Data> </Group> <Group ID="B"> <Data> <Quantity>1</Quantity> <Price>89.99</Price> </Data> <Data> <Quantity>10</Quantity> <Price>.99</Price> </Data> <Data> <Quantity>8</Quantity> <Price>6.99</Price>
38 </Data>
</Group> </Root>
3.6. Những thao tác biến đổi trên cây XML
3.6.1. Thêm phần tử, thuộc tính và nút vào một cây XML
Thêm nút vào cuối cây hoặc đầu cây dùng phương thức .Add và .AddFirst .
C#
XElement xmlTree = new XElement("Root", new XElement("Child1", 1), new XElement("Child2", 2), new XElement("Child3", 3), new XElement("Child4", 4), new XElement("Child5", 5) );
xmlTree.Add(new XElement("NewChild", "new content")); Console.WriteLine(xmlTree); <Root> <Child1>1</Child1> <Child2>2</Child2> <Child3>3</Child3> <Child4>4</Child4> <Child5>5</Child5> <NewChild>new content</NewChild>
39 </Root>
3.6.2. Thay đổi phần tử, thuộc tính và nút của một cây XML
Sử dụng phương thức XAttribute.SetValue thay đổi giá trị thuộc tính "Att"
từ"root" thành"new content".
C#
XElement root = new XElement("Root", new XAttribute("Att", "root"),
(“Root”) );
Console.WriteLine(root);
Console.WriteLine(“---”) XAttribute att = root.Attribute("Att"); att.SetValue("new content");
root.SetValue("new content"); Console.WriteLine(root);
<Root Att="root">Root</Root> <--->
<Root Att="new content">new content</Root>
Sử dụng phương thức XNode.ReplaceWith thay đổi nút có tên "Child3"có nội dung
"child3 content" thành "NewChild" nội dung "new content" .
C#
XElement xmlTree = new XElement("Root", new XElement("Child1", "child1 content"), new XElement("Child2", "child2 content"), new XElement("Child3", "child3 content"),
40 new XElement("Child4", "child4 content"),
new XElement("Child5", "child5 content") );
XElement child3 = xmlTree.Element("Child3"); child3.ReplaceWith(
new XElement("NewChild", "new content") ); Console.WriteLine(xmlTree); Xml <Root> <Child1>child1 content</Child1> <Child2>child2 content</Child2> <NewChild>new content</NewChild> <Child4>child4 content</Child4> <Child5>child5 content</Child5> </Root>
Thiết lập giá trị của lớp con bằng hàm XElement.SetElementValue.
C#
// Create an element with no content XElement root = new XElement("Root");
// Add some name/value pairs. root.SetElementValue("Ele1", 1); root.SetElementValue("Ele2", 2);
41 root.SetElementValue("Ele3", 3);
Console.WriteLine(root);
// Modify one of the name/value pairs. root.SetElementValue("Ele2", 22); Console.WriteLine(root);
// Remove one of the name/value pairs. root.SetElementValue("Ele3", null); Console.WriteLine(root); <Root> <Ele1>1</Ele1> <Ele2>2</Ele2> <Ele3>3</Ele3> </Root> <Root> <Ele1>1</Ele1> <Ele2>22</Ele2> <Ele3>3</Ele3> </Root> <Root> <Ele1>1</Ele1> <Ele2>22</Ele2>
42 </Root>
3.6.3. Xóa phần tử, thuộc tính và nút từ một cây XML
Ví dụ sau dùng phương thức XElement.RemoveAll xóa những phần tử con và thuộc tính của một cây XML
C#
XElement root = new XElement("Root", new XAttribute("Att1", 1), new XAttribute("Att2", 2), new XAttribute("Att3", 3), new XElement("Child1", 1), new XElement("Child2", 2), new XElement("Child3", 3) );
root.RemoveAll(); // removes children elements and attributes of root Console.WriteLine(root);
Xml
<Root />
Ví dụ tiếp theo dùng phương thức XElement.RemoveAttributes xóa toàn bộ thuộc tính của một cây XML.
C#
XElement root = new XElement("Root", new XAttribute("Att1", 1),
43 new XAttribute("Att2", 2), new XAttribute("Att3", 3), new XElement("Child1", 1), new XElement("Child2", 2), new XElement("Child3", 3) ); root.RemoveAttributes(); Console.WriteLine(root); Xml <Root> <Child1>1</Child1> <Child2>2</Child2> <Child3>3</Child3> </Root>
Dùng phương thức XNode.Remove xóa một nút của cây XML
C#
XElement xmlTree = new XElement("Root", new XElement("Child1", "child1 content"), new XElement("Child2", "child2 content"), new XElement("Child3", "child3 content"), new XElement("Child4", "child4 content"), new XElement("Child5", "child5 content") );
XElement child3 = xmlTree.Element("Child3"); child3.Remove();
44 Xml <Root> <Child1>child1 content</Child1> <Child2>child2 content</Child2> <Child4>child4 content</Child4> <Child5>child5 content</Child5> </Root>
45
4. LINQ to SQL
4.1. Giới thiệu
LINQ to SQL là một phiên bản hiện thực hóa của O/RM (object relational mapping) có bên trong .NET Framework bản "Orcas" (nay là .NET 3.5), nó cho phép bạn mô hình hóa một cơ sở dữ liệu dùng các lớp .NET. Sau đó bạn có thể truy vấn cơ sở dữ liệu (CSDL) dùng LINQ, cũng như cập nhật/thêm/xóa dữ liệu từđó.
LINQ to SQL hỗ trợ đầy đủ transaction, view và các stored procedure (SP). Nó cũng
cung cấp một cách dễ dàng để thêm khả năng kiểm tra tính hợp lệ của dữ liệu và các quy tắc vào trong mô hình dữ liệu của bạn.
46
Tầng kiến trúc của LINQ to SQL là cầu nối giao tiếp giữa Application và SQL Server