Udostępnij za pośrednictwem


Zapytania w LINQ to DataSet

Zapytanie to wyrażenie, które pobiera dane ze źródła danych. Zapytania są zwykle wyrażane w wyspecjalizowanym języku zapytań, takim jak SQL dla relacyjnych baz danych i XQuery dla języka XML. W związku z tym deweloperzy musieli nauczyć się nowego języka zapytań dla każdego typu źródła danych lub formatu danych, który wysyłają zapytania. Zapytanie zintegrowane z językiem (LINQ) oferuje prostsze połączenie tryb namiotu l do pracy z danymi w różnych rodzajach źródeł danych i formatów. W zapytaniu LINQ zawsze pracujesz z obiektami programowania.

Operacja zapytania LINQ składa się z trzech akcji: uzyskiwania źródła danych lub źródeł, tworzenia zapytania i wykonywania zapytania.

Źródła danych, które implementują IEnumerable<T> interfejs ogólny, mogą być odpytywane za pośrednictwem LINQ. Wywołanie AsEnumerable metody na DataTable obiekcie zwraca obiekt, który implementuje interfejs ogólny IEnumerable<T> , który służy jako źródło danych dla zapytań LINQ to DataSet.

W zapytaniu określisz dokładnie informacje, które chcesz pobrać ze źródła danych. Zapytanie może również określać sposób sortowania, grupowania i kształtowania informacji przed ich zwróceniem. W linQ zapytanie jest przechowywane w zmiennej. Jeśli zapytanie jest przeznaczone do zwracania sekwencji wartości, zmienna kwerendy musi być typem wyliczalnym. Ta zmienna kwerendy nie wykonuje żadnej akcji i nie zwraca żadnych danych; przechowuje tylko informacje o kwerendzie. Po utworzeniu zapytania należy wykonać to zapytanie, aby pobrać dowolne dane.

W zapytaniu, które zwraca sekwencję wartości, zmienna kwerendy nigdy nie przechowuje wyników zapytania i przechowuje tylko polecenia zapytania. Wykonanie zapytania jest odroczone, dopóki zmienna kwerendy nie zostanie iterowana w foreach pętli lub For Each . Jest to nazywane wykonywaniem odroczonym. Oznacza to, że wykonywanie zapytań następuje jakiś czas po utworzeniu zapytania. Oznacza to, że można wykonać zapytanie tak często, jak chcesz. Jest to przydatne, gdy na przykład masz bazę danych, która jest aktualizowana przez inne aplikacje. W aplikacji można utworzyć zapytanie, aby pobrać najnowsze informacje i wielokrotnie wykonywać zapytanie, zwracając zaktualizowane informacje za każdym razem.

W przeciwieństwie do zapytań odroczonych, które zwracają sekwencję wartości, zapytania zwracające pojedynczą wartość są wykonywane natychmiast. Niektóre przykłady pojedynczych zapytań to Count, Max, Averagei First. Są one wykonywane natychmiast, ponieważ wyniki zapytania są wymagane do obliczenia pojedynczego wyniku. Aby na przykład znaleźć średnią wyników zapytania, należy wykonać zapytanie, aby funkcja średniowłaszowa mogła pracować z danymi wejściowymi. Można również użyć ToList metod lub ToArray w zapytaniu, aby wymusić natychmiastowe wykonanie zapytania, które nie generuje pojedynczej wartości. Te techniki wymuszania natychmiastowego wykonywania mogą być przydatne, gdy chcesz buforować wyniki zapytania.

Zapytania

Zapytania LINQ to DataSet można sformułować w dwóch różnych składniach: składni wyrażenia zapytania i składni zapytań opartej na metodzie.

Składnia wyrażenia zapytania

Wyrażenia zapytań to deklaratywna składnia zapytania. Ta składnia umożliwia deweloperowi pisanie zapytań w języku C# lub Visual Basic w formacie podobnym do języka SQL. Korzystając ze składni wyrażeń zapytania, można wykonywać nawet złożone operacje filtrowania, porządkowania i grupowania źródeł danych przy minimalnym kodzie. Aby uzyskać więcej informacji, zobacz LINQ Query Expressions and Basic Query Operations (Visual Basic)( Wyrażenia zapytań LINQ i Podstawowe operacje zapytań (Visual Basic).

Środowisko uruchomieniowe języka wspólnego programu .NET Framework (CLR) nie może odczytać samej składni wyrażenia zapytania. W związku z tym w czasie kompilacji wyrażenia zapytania są tłumaczone na coś, co clR rozumie: wywołania metody. Te metody są określane jako standardowe operatory zapytań. Jako deweloper masz możliwość bezpośredniego wywoływania ich przy użyciu składni metody zamiast składni zapytania. Aby uzyskać więcej informacji, zobacz Składnia zapytań i składnia metody w LINQ. Aby uzyskać więcej informacji na temat standardowych operatorów zapytań, zobacz Standardowe operatory zapytań — omówienie.

W poniższym przykładzie użyto Select metody , aby zwrócić wszystkie wiersze z Product tabeli i wyświetlić nazwy produktów.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> query =
    from product in products.AsEnumerable()
    select product;

Console.WriteLine("Product Names:");
foreach (DataRow p in query)
{
    Console.WriteLine(p.Field<string>("Name"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = From product In products.AsEnumerable() _
            Select product
Console.WriteLine("Product Names:")
For Each p In query
    Console.WriteLine(p.Field(Of String)("Name"))
Next

Składnia zapytań oparta na metodzie

Innym sposobem sformułowania zapytań LINQ to DataSet jest użycie zapytań opartych na metodzie. Składnia zapytania oparta na metodzie jest sekwencją wywołań metod bezpośrednich do metod operatorów LINQ, przekazując wyrażenia lambda jako parametry. Aby uzyskać więcej informacji, zobacz Wyrażenia lambda.

W tym przykładzie użyto metody Select , aby zwrócić wszystkie wiersze z Product i wyświetlić nazwy produktów.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

var query = products.AsEnumerable().
    Select(product => new
    {
        ProductName = product.Field<string>("Name"),
        ProductNumber = product.Field<string>("ProductNumber"),
        Price = product.Field<decimal>("ListPrice")
    });

Console.WriteLine("Product Info:");
foreach (var productInfo in query)
{
    Console.WriteLine("Product name: {0} Product number: {1} List price: ${2} ",
        productInfo.ProductName, productInfo.ProductNumber, productInfo.Price);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = products.AsEnumerable() _
    .Select(Function(product As DataRow) New With _
    { _
        .ProductName = product.Field(Of String)("Name"), _
        .ProductNumber = product.Field(Of String)("ProductNumber"), _
        .Price = product.Field(Of Decimal)("ListPrice") _
    })

Console.WriteLine("Product Info:")
For Each product In query
    Console.Write("Product name: " & product.ProductName)
    Console.Write("Product number: " & product.ProductNumber)
    Console.WriteLine("List price: $ " & product.Price)
Next

Komponowanie zapytań

Jak wspomniano wcześniej w tym temacie, zmienna kwerendy przechowuje tylko polecenia zapytania, gdy zapytanie jest przeznaczone do zwracania sekwencji wartości. Jeśli zapytanie nie zawiera metody, która spowoduje natychmiastowe wykonanie, rzeczywiste wykonanie zapytania zostanie odroczone do momentu iteracji zmiennej kwerendy w foreach pętli lub For Each . Odroczone wykonywanie umożliwia łączenie wielu zapytań lub rozszerzanie zapytania. Gdy zapytanie zostanie rozszerzone, zostanie zmodyfikowane tak, aby obejmowało nowe operacje, a ostateczne wykonanie będzie odzwierciedlać zmiany. W poniższym przykładzie pierwsze zapytanie zwraca wszystkie produkty. Drugie zapytanie rozszerza pierwszy przy użyciu polecenia Where , aby zwrócić wszystkie produkty o rozmiarze "L":

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> productsQuery =
    from product in products.AsEnumerable()
    select product;

IEnumerable<DataRow> largeProducts =
    productsQuery.Where(p => p.Field<string>("Size") == "L");

Console.WriteLine("Products of size 'L':");
foreach (DataRow product in largeProducts)
{
    Console.WriteLine(product.Field<string>("Name"));
}

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim productsQuery = From product In products.AsEnumerable() _
                    Select product

Dim largeProducts = _
    productsQuery.Where(Function(p) p.Field(Of String)("Size") = "L")

Console.WriteLine("Products of size 'L':")
For Each product In largeProducts
    Console.WriteLine(product.Field(Of String)("Name"))
Next

Po wykonaniu zapytania nie można tworzyć żadnych dodatkowych zapytań, a wszystkie kolejne zapytania będą używać operatorów LINQ w pamięci. Wykonanie zapytania będzie wykonywane, gdy iterujesz zmienną kwerendy w foreach instrukcji or For Each lub przez wywołanie jednego z operatorów konwersji LINQ, które powodują natychmiastowe wykonanie. Te operatory obejmują następujące elementy: ToList, , ToArrayToLookupi ToDictionary.

W poniższym przykładzie pierwsze zapytanie zwraca wszystkie produkty uporządkowane według ceny katalogowej. Metoda ToArray jest używana do wymuszania natychmiastowego wykonywania zapytania:

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> query =
    from product in products.AsEnumerable()
    orderby product.Field<Decimal>("ListPrice") descending
    select product;

// Force immediate execution of the query.
IEnumerable<DataRow> productsArray = query.ToArray();

Console.WriteLine("Every price from highest to lowest:");
foreach (DataRow prod in productsArray)
{
    Console.WriteLine(prod.Field<Decimal>("ListPrice"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = _
        From product In products.AsEnumerable() _
        Order By product.Field(Of Decimal)("ListPrice") Descending _
        Select product

' Force immediate execution of the query.
Dim productsArray = query.ToArray()

Console.WriteLine("Every price From highest to lowest:")
For Each prod In productsArray
    Console.WriteLine(prod.Field(Of Decimal)("ListPrice"))
Next

Zobacz też