C # Getting Started with LINQ

Source: Internet
Author: User

C # Getting Started with LINQ
Introduction to LINQ

Language-Integrated Query (LINQ) is an innovative feature introduced in Visual Studio 2008 and the. NET Framework version 3.5.

Traditionally, queries for data are represented as simple strings, without compile-time type checking or IntelliSense support. In addition, you must learn a different query language for each of the following data sources: SQL database, XML document, various WEB services, and so on. With LINQ, you can write queries against a strongly typed collection of objects using language keywords and familiar operators.

C # Getting Started with LINQ (top)

In Visual Studio, you can write LINQ queries for the following data sources: SQL Server databases, XML documents, ADO datasets, and any collection of objects that support the IEnumerable or generic ienumerable<t> interface 。

Usage requirements: Project ≥.net Framework 3.5.

I. INTRODUCTION of LINQ Queries

A query is an expression that retrieves data from a data source. Over time, people have developed different languages for various data sources, for example, SQL for relational databases and XQuery for XML. As a result, developers have to learn a new query language for each data source or data format that they must support.

LINQ simplifies this situation by providing a consistent model that uses data across data sources and data formats. In a LINQ query, objects are always used. You can use the same encoding pattern to query and transform data in XML documents, SQL databases, ADO datasets,. NET collections, and any other format for which the LINQ provider is available.

1.1 Three parts of a query operation

Operation Trilogy: ① fetch data source ② Create query ③ Execute Query

Internal class Program

{

private static void Main (string[] args)

{

1. Get the data source

var nums = new Int[7] {0, 1, 2, 3, 4, 5, 6};

2. Create a query

var numquery =

From Num in Nums

WHERE (num% 2) = = 0

Select num;

3. Execute the Query

foreach (Var num in numquery)

{

Console.WriteLine ("{0}", num);

}

}

}


C # Getting Started with LINQ (top)

Shows the full query operation. In LINQ, the execution of a query is very different from the query itself; in other words, the query itself refers to creating only query variables and not retrieving any data.

C # Getting Started with LINQ (top)

1.2 Data sources

In the previous example, because the data source is an array, it implicitly supports the generic ienumerable<t> interface. Types that support ienumerable<t> or derived interfaces, such as generic iqueryable<t>, are called queryable types.

A queryable type can be used as a LINQ data source without modification or special processing. If the source data is not yet present in memory as a queryable type, the LINQ provider must represent the source data in this manner. For example, LINQ to XML loads an XML document into a queryable XElement type:

To create a data source from XML

Using System.Xml.Linq;

var contacts = Xelement.load (@ "C:\xxx.xml");


In LINQ to SQL, you first need to create an object-relational mapping. Queries are written against these objects and then the communication to the database is handled by LINQ to SQL at run time.

var db = new Northwnd (@ "C:\northwnd.mdf");

Find a customer in London

var custquery= from Cust in db. Customers

Where Cust. City = = "London"

Select Cust;


Customers represents a specific table in a database

1.3 Queries

The query specifies the information to retrieve from the data source. Queries can also specify how to sort, group, and structure the information before returning it. The query is stored in a query variable and initialized with a query expression.

The query in the previous example is to return all the even numbers from an array of integers. The query expression consists of three clauses: from, where, and select. (If you are familiar with SQL, you will notice that the order of these clauses is the opposite of the order in SQL.) The FROM clause specifies the data source, where clause specifies that the filter is applied, and the SELECT clause specifies the type of element returned. It is important to note that in LINQ, the query variable itself does nothing and returns no data. It simply stores the information necessary to generate the results at a later time when the query is executed.

1.4 Query execution

1. Deferred execution

As mentioned earlier, the query variable itself simply stores the query command. The actual query execution is deferred until the query variable is cycled through the foreach statement. This concept is called "deferred execution."

2. Force immediate Execution

Queries that perform aggregate functions on a series of source elements must first iterate through the elements. Count, Max, Average, and first belong to this type of query. Because the query itself must use foreach to return results, these queries do not use explicit foreach statements when they are executed. Also note that these types of queries return a single value instead of a IEnumerable collection.

var numbers = new Int[7] {0, 1, 2, 3, 4, 5, 6};

var evennumquery =

From Num in numbers

WHERE (num% 2) = = 0

Select num;

var evennumcount = Evennumquery.count ();


C # Getting Started with LINQ (top)

To force an immediate execution of arbitrary queries and to cache their results, you can call the Tolist<tsource> or Toarray<tsource> method.

var numQuery2 = (from num in numbers

WHERE (num% 2) = = 0

Select num). ToList ();

var numQuery3 = (from num in numbers

WHERE (num% 2) = = 0

Select num). ToArray ();


In addition, you can force a query by placing a foreach loop where it immediately follows the query expression. However, you can also cache all data in a single collection object by calling ToList or ToArray.

Second, the basic LINQ query operation

2.1 Get Data Source: from

In a LINQ query, the first step is to specify the data source. As in most programming languages, you must declare a variable before you can use it. In LINQ queries, the first use of the FROM clause is to introduce data sources and scope variables.

Queryallcustomers is the ienumerable<cutsomer> type

Data source (customers) and range variables (Cust)

var queryallcustomers = from Cust in Customers

Select Cust;


A range variable is similar to an iteration variable in a foreach loop, but in a query expression, the iteration does not actually occur. When you execute a query, the range variable is used as a reference to each successive element in customers. Because the compiler can infer the type of Cust, you do not have to explicitly specify this type.

2.2 Filtering: where

Perhaps the most common query operation is to apply a filter in the form of a Boolean expression. This filter causes the query to return only those elements whose expression result is true. Use the WHERE clause to generate the results. In effect, a filter specifies which elements are excluded from the source sequence.

var querylondoncustomers = from Cust in Customers

Where Cust. City = "London"

Select Cust;


You can use the familiar C # logic and (&&) and OR (| | operator to apply any number of filter expressions in the WHERE clause as needed.

Where Cust. City = "London" && Cust. Name = "Devon"

Where Cust. City = "London" | | Cust. Name = "Paris"


2.3 Reviews sorted By:


It is generally easy to sort the returned data. The ORDER BY clause causes the elements in the returned sequence to be sorted according to the default comparer for the type being sorted.

var querylondoncustomers = from Cust in Customers

Where Cust. City = "London"

Cust. Name Descending

Select Cust;


Because Name is a string, the default comparer performs an alphabetical sort from a to Z. To sort the results in reverse order (from Z to A), use the orderby...descending clause.

2.4 Group: Group

Using the group clause, you can group the results by the specified key.

var querylondoncustomers = from Cust in Customers

Group Cust by Cust. City;


foreach (Var querylondoncustomer in querylondoncustomers)

{

Console.WriteLine (Querylondoncustomer.key);

foreach (Var cust in Querylondoncustomer)

{

Console.WriteLine (Cust. Name);

}

}


You can specify that the results should be grouped by city so that all customers in London or Paris are in their respective groups.

In this case, Cust. City is the key.

When you end a query by using the group clause, the result takes the form of a list. Each element in the list is an object that has a key member and a list of elements grouped by the key. When iterating through queries that generate group sequences, you must use nested foreach loops. The outer loop is used to iterate through each group, and the inner loop is used to iterate through the members of each group.

If you must reference the results of a group operation, you can use the INTO keyword to create identifiers that can be queried further.

Custquery is ienumable<igrouping<string, customer>> type

var custquery = from Cust in Customers

Group Cust by Cust. City

Into CustGroup

where Custgroup.count () > 2

Custgroup.key

Select CustGroup;


The query here only returns those groups that contain more than two customers.

2.5 Joins: Join

Join operations create associations between sequences in the data source that do not have an explicit modeling. For example, you can perform a join to find all customers and resellers in the same location. In LINQ, a join clause is always run against a collection of objects rather than directly against a database table.

var innerjoinquery = from Cust in Customers

Join Dist in distributors on Cust. City equals Dist. City

Select New {CustomerName = cust. Name, Distributorname = Dist. Name};


In LINQ, a join clause is always run against a collection of objects rather than directly against a database table.


In LINQ, you do not have to use joins as frequently as in SQL, because foreign keys in LINQ are represented in the object model as properties that contain collections of items.

From order in customer.orders ...

2.6 Selection (projection): Select

The SELECT clause generates a query result and specifies the shape or type of each returned element.

For example, you can specify whether the result contains the entire Customer object, only one member, a subset of members, or a completely different result type based on a calculation or new object creation. When a SELECT clause generates something other than a copy of the source element, the operation is called projection.

Iii. using LINQ for data conversion

Language-Integrated Query (LINQ) is not only useful for retrieving data, but it is also a powerful data transformation tool. By using a LINQ query, you can use the source sequence as input and modify it in several ways to create a new output sequence. You can modify the sequence by sorting and grouping without having to modify the element itself. However, the most powerful feature of LINQ queries is the ability to create new types. This feature is implemented in the SELECT clause. For example, you can perform the following tasks:

3.1 Joining multiple inputs to an output sequence

Class Student

{

public string Name {get; set;}

public int Age {get; set;}

public string City {get; set;}

Public list<int> Scores {get; set;}

}

Class Teacher

{

public int Id {get; set;}

public string Name {get; set;}

public int Age {get; set;}

public string City {get; set;}

}


Two classes of students and teachers

Internal class Program

{

private static void Main (string[] args)

{

Create a First Data source

var students = new List<student> ()

{

New Student ()

{

Age = 23,

City = "Guangzhou",

Name = "Small C",

Scores = new List<int> () {85,88,83,97}

},

New Student ()

{

Age = 18,

City = "Guangxi",

Name = "Xiaoming",

Scores = new List<int> () {86,78,85,90}

},

New Student ()

{

Age = 33,

City = "Dream",

Name = "Small Three",

Scores = new List<int> () {86,68,73,97}

}

};

Create a second data source

var teachers = new List<teacher> ()

{

New Teacher ()

{

Age = 35,

City = "Dream",

Name = "Kiss-Doraemon"

},

New Teacher ()

{

Age = 28,

City = "Yunnan",

Name = "Little Red"

},

New Teacher ()

{

Age = 38,

City = "Henan",

Name = "Lili"

}

};

Create a query

var peopleindreams = (from student in students

where student. City = = "Dream"

Select Student. Name)

. Concat (from teacher in teachers

where teacher. City = = "Dream"

Select Teacher. Name);

Execute Query

foreach (var in peopleindreams)

{

Console.WriteLine (person);

}

Console.read ();

}

}

Manuscripts: Diligent Learning qkxue.net
Extended reading:
C # Getting Started with LINQ (top)
Http://qkxue.net/info/21835/nbsp-LINQ
C # Getting Started with LINQ (bottom)
Http://qkxue.net/info/21834/nbsp-LINQ

C # Getting Started with LINQ

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.