Fact-checked by Grok 2 weeks ago

Language Integrated Query

Language Integrated Query () is a set of technologies developed by that integrates query capabilities directly into the syntax of .NET programming languages, primarily C# and , enabling developers to write type-safe, declarative queries against diverse data sources such as collections, databases, XML, and . Introduced in November 2007 as part of C# 3.0 and .NET Framework 3.5, LINQ transforms querying into a first-class construct, supporting both query expression reminiscent of SQL and method-based syntax using extension methods and lambda expressions. The origins of trace back to 2004, when C# chief architect proposed integrating sequence operators for collections into the language, a concept that evolved through collaboration with developers like Peter Golde and received early endorsement during Microsoft's internal review processes. This innovation addressed the limitations of prior data access methods by providing compile-time type checking, IntelliSense support, and a unified model for querying disparate data formats, reducing the need for language-specific APIs or string-based queries prone to runtime errors. Key features of LINQ include support for standard query operators like filtering (Where), projection (Select), grouping (GroupBy), and joining, all implemented as higher-order functions that operate on IEnumerable or IQueryable interfaces. providers, such as (via ) for relational databases or LINQ to XML for document manipulation, translate these queries into source-specific executions, while Parallel LINQ (PLINQ) extends capabilities for concurrent processing on multi-core systems. LINQ's impact on .NET development has been profound, bridging object-oriented and paradigms, enhancing code readability, and influencing subsequent language features like expression trees that enable dynamic query construction. By standardizing data querying across in-memory objects, remote services, and structured files, it has become a cornerstone of modern .NET applications, with ongoing evolution in later .NET versions, including new methods like CountBy and AggregateBy in .NET 9 (2024) and join operators in .NET 10 (2025), supporting advanced scenarios like querying in databases.

Overview

Definition and Purpose

Language Integrated Query (LINQ) is a set of technologies in the Microsoft .NET ecosystem that integrates query capabilities directly into programming languages such as C# and Visual Basic .NET, allowing developers to express queries using native language syntax rather than external domain-specific languages. This enables SQL-like operations on a wide range of data sources, including in-memory collections, relational databases, and XML documents, treating queries as first-class language constructs. The primary purpose of is to bridge the gap between paradigms and declarative query expressions, thereby reducing the impedance mismatch between object-oriented code and disparate data access mechanisms. By embedding query logic within the host language, LINQ simplifies data manipulation tasks, eliminates the need to switch contexts or languages for querying, and promotes a unified approach to data operations across heterogeneous sources. This design fosters more productive development by abstracting common patterns like filtering, sorting, and grouping into concise, readable code. LINQ has evolved to support cross-platform development in .NET Core and later versions (as of .NET 9 in 2024). LINQ supports two equivalent syntax forms for queries: declarative query expressions, which resemble SQL, and method-based syntax using extension methods. For example, to filter scores greater than 80 from an , one can write:
csharp
int[] scores = { 97, 92, 81, 60 };
IEnumerable<int> highScores = from score in scores
                              where score > 80
                              select score;
The equivalent method syntax is scores.Where(score => score > 80). LINQ was announced in 2005 at the Professional Developers Conference as part of the vision for .NET Framework 3.0, aiming to enhance developer productivity through integrated query support.

Key Benefits and Use Cases

Language Integrated Query () provides developers with compile-time , allowing queries to be verified against the language's before runtime, which reduces errors that might occur in traditional string-based query languages like SQL. This is complemented by full IntelliSense support in integrated development environments, enabling autocompletion and immediate feedback on query syntax and available methods during coding. Additionally, LINQ's query operators support , permitting complex queries to be built by simpler operations in a declarative manner, which enhances readability and maintainability compared to imperative loops. Deferred execution further optimizes performance by postponing query evaluation until the results are enumerated, avoiding unnecessary computations on large datasets. One of LINQ's primary productivity advantages is the reduction in boilerplate code; for instance, operations like filtering and that previously required multiple lines of imperative code in foreach loops can now be expressed concisely in a single query expression. This declarative approach not only shortens code length but also makes intentions clearer, leading to faster development and fewer bugs in data manipulation tasks. For parallel processing needs, extensions like Parallel LINQ (PLINQ) build on these benefits to handle large-scale computations across multiple cores efficiently. In practical use cases, excels at querying in-memory collections, such as filtering and sorting lists in applications to display products matching criteria. For example, to retrieve even numbers from an :
csharp
int[] numbers = { 0, 1, 2, 3, 4, 5, 6 };
var evenQuery = from num in numbers
                where (num % 2) == 0
                select num;
This query filters the data declaratively, producing a sequence of even integers for further processing. LINQ is also widely applied in XML manipulation, where it enables straightforward transformation and querying of XML documents without custom parsing logic, such as extracting elements based on attributes in configuration files. Another common scenario involves aggregating data in web applications, like summing sales by region from a collection of transactions, which simplifies reporting features in . For database interactions, LINQ allows prototyping and executing queries directly in code, such as retrieving customers from a specific city using :
csharp
var customerQuery = from cust in db.Customers
                    where cust.City == "London"
                    select cust;
This approach facilitates rapid iteration on query logic before committing to changes, bridging the gap between application code and relational data sources. In desktop applications, supports searches by treating directories as queryable collections, enabling efficient pattern-based retrieval of files.

History

Origins and Development

Language Integrated Query (LINQ) originated in the early within Microsoft's efforts to bridge the gap between programming languages and data querying paradigms. The concept was pioneered by researchers including Erik Meijer and Wolfram Schulte, who began exploring extensions to C# for integrating query capabilities directly into the language. This work drew inspiration from languages, particularly Haskell's monad comprehensions, which provided a model for composing queries as embedded domain-specific languages within general-purpose code. Initial prototypes emerged around 2003–2004 as part of the Cω (C-omega) project, an experimental extension of C# that incorporated both concurrency and query features to handle diverse data sources more fluidly. The development process involved close collaboration between Microsoft's C# language design team, led by , and data access specialists from the SQL Server group. In 2004, the Cω initiative merged with Hejlsberg's separate C# sequence operator project, formalizing the core ideas into what would become . This integration was influenced by the need to unify querying across objects, relational databases, and XML, addressing longstanding challenges in the .NET ecosystem such as the impedance mismatch between object-oriented code and relational data models. Academic influences, including work on type-safe query integration, further shaped the design, emphasizing composable operators that could translate to backend-specific implementations. Key motivations stemmed from limitations in .NET 2.0's data handling, including verbose XML processing via APIs like XmlDocument and the inefficiencies of disconnected datasets in ADO.NET, which often required manual bridging between in-memory objects and external data stores. LINQ aimed to enable developers to write queries using familiar language syntax, reducing boilerplate code and improving type safety while mitigating issues like SQL injection through compile-time checks. Milestones included the first public preview at Microsoft's Professional Developers Conference (PDC) in September 2005, where prototypes of LINQ, DLinq (for relational data), and XLinq (for XML) were demonstrated. Further refinement led to its integration into the Visual Studio 2008 beta releases, paving the way for the full launch with .NET Framework 3.5.

Major Releases and Evolution

Language Integrated Query (LINQ) was initially released on November 19, 2007, as a core component of the .NET Framework 3.5, coinciding with the introduction of C# 3.0 and Visual Basic .NET 9.0. This launch provided foundational query capabilities integrated into the .NET languages, including key providers such as LINQ to SQL for interactions, LINQ to Objects for in-memory collections, and LINQ to XML for document manipulation. Subsequent evolutions expanded LINQ's scope and performance. In April 2010, .NET Framework 4.0 introduced Parallel LINQ (PLINQ), enabling parallel execution of queries to leverage multi-core processors for improved throughput on large datasets. With the advent of 1.0 in June 2016, LINQ gained cross-platform compatibility on and macOS, accompanied by initial performance optimizations in query execution and memory usage. The unification under .NET 5, released on November 10, 2020, further enhanced cross-platform support by merging .NET Framework and .NET Core ecosystems, allowing LINQ queries to run seamlessly across diverse environments. Recent updates have focused on extending LINQ's expressiveness and efficiency. .NET 6, launched on November 8, 2021, added new standard query operators such as Chunk, MinBy, MaxBy, and overloads for Take and FirstOrDefault, simplifying common data processing patterns like batching and selection. In .NET 8, released on November 14, 2023, enhancements to IQueryable improved LINQ-to-SQL translation in Entity Framework Core 8, enabling better support for complex queries involving JSON columns, primitive collections, and value objects. .NET 9, released on November 12, 2024, delivered substantial performance gains in LINQ execution through optimizations like improved async stream handling with ValueTask and new operators including CountBy, AggregateBy, and Index for grouped counting and enumeration. .NET 10, released on November 11, 2025, further advanced LINQ capabilities via EF Core 10, introducing enhancements such as support for vector search, native JSON handling, and additional performance optimizations for complex queries. Regarding deprecations, LINQ to SQL, while included in the initial release, has been largely superseded by (EF) and EF Core for modern database access, though it remains available for legacy applications without active development.

Core Architecture

Standard Query Operators

The standard query operators in (LINQ) form the foundational for querying sequences of data in .NET, implemented as extension methods in the System.Linq namespace. These methods extend the IEnumerable<T> interface for in-memory collections and the IQueryable<T> interface for query providers that can translate operations into other query languages, such as SQL. They enable a fluent, composable approach to data manipulation, supporting operations like filtering, projection, sorting, and aggregation without requiring custom iteration logic. A core characteristic of these operators is deferred execution, where the query is not evaluated until the results are enumerated, such as through a foreach loop or materialization method like ToList(). This allows multiple operators to be chained together, building a query expression that is executed only once, optimizing performance by avoiding intermediate collections. For instance, chaining Where and Select on a sequence defers the filtering and projection until enumeration, processing elements in a single pass. When applied to IQueryable<T>, the operators construct expression trees—hierarchical representations of the query using the System.Linq.Expressions namespace—rather than immediate delegates. These trees allow LINQ providers to analyze and translate the query into domain-specific code, such as SQL for databases, enabling provider-specific optimizations like index usage. Lambdas passed to operators, such as predicates in Func<T, bool>, serve as for building these expressions. The operators are categorized based on their functionality, with key examples illustrated below using method syntax in C#. Consider a sample sequence of integers for demonstrations:
csharp
IEnumerable<int> numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Filtering: The Where operator filters a sequence based on a , returning elements that satisfy the condition. Its signature is public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate). For example:
csharp
IEnumerable<int> evenNumbers = numbers.Where(n => n % 2 == 0);
// Results in {2, 4, 6, 8, 10}, executed only upon [enumeration](/page/Enumeration).
This supports indexing overloads for element access during filtering. Projection and Transformation: The Select operator projects each element into a new form, transforming the sequence without altering its length. Signature: public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector). Example:
csharp
IEnumerable<int> squares = numbers.Select(n => n * n);
// Yields {1, 4, 9, 16, 25, 36, 49, 64, 81, 100}.
SelectMany flattens nested sequences, useful for one-to-many projections. Signature: public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector). It applies the selector to each element and concatenates the results. Partitioning: Operators like Take and [Skip](/page/Skip) divide the sequence into subsets by count. Take signature: public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count). Example:
csharp
IEnumerable<int> firstThree = numbers.Take(3); // {1, 2, 3}
Skip omits the first count elements: public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count). TakeWhile and SkipWhile partition based on a condition until it fails. Ordering: OrderBy sorts the sequence in ascending order by a key. Signature: public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector). Example (assuming a list of strings):
csharp
List<string> words = new() { "apple", "banana", "cherry" };
IEnumerable<string> sorted = words.OrderBy(w => w.Length);
// {"apple", "banana", "cherry"}
OrderByDescending, ThenBy, and ThenByDescending extend sorting for descending or multi-level orders; Reverse inverts the sequence. Grouping: GroupBy partitions elements by a key, producing groups as IGrouping<TKey, TElement>. Signature: public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector). Example with numbers by :
csharp
IEnumerable<IGrouping<bool, int>> groups = numbers.GroupBy(n => n % 2 == 0);
// Groups: Even {2,4,6,8,10}, Odd {1,3,5,7,9}
Overloads allow result selectors for custom projections. ToLookup creates an immediate lookup dictionary. Joining: Join performs an inner join between two sequences on matching keys. Signature: public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector). It correlates elements and projects results. GroupJoin is an outer join equivalent, grouping inner matches per outer element. The full set of standard query operators, as defined in the System.Linq.Enumerable class, exceeds 50 methods including overloads, grouped by category below with representative signatures (focusing on primary forms for IEnumerable<T>). These implement the LINQ pattern and are available across .NET Framework, .NET Core, and .NET 5+.

Filtering

  • Where<TSource>(IEnumerable<TSource>, Func<TSource, bool>): Filters by .
  • Where<TSource>(IEnumerable<TSource>, Func<TSource, int, bool>): Indexed .

Projection and Transformation

  • Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>): Projects elements.
  • Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, int, TResult>): Indexed projection.
  • SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>): Flattens projections.
  • SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>): Indexed flat projection.
  • SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, int, IEnumerable<TCollection>>, Func<TSource, TCollection, int, TResult>): Fully indexed.

Partitioning

  • Take<TSource>(IEnumerable<TSource>, int): Takes first count elements.
  • Take<TSource>(IEnumerable<TSource>, Range): Takes by range (NET 6+).
  • TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, bool>): Takes while condition holds.
  • TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, int, bool>): Indexed.
  • Skip<TSource>(IEnumerable<TSource>, int): Skips first count.
  • Skip<TSource>(IEnumerable<TSource>, Range): Skips by range.
  • SkipWhile<TSource>(IEnumerable<TSource>, Func<TSource, bool>): Skips while condition.
  • SkipWhile<TSource>(IEnumerable<TSource>, Func<TSource, int, bool>): Indexed.

Ordering

  • OrderBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>): Ascending sort.
  • OrderBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>): With comparer.
  • OrderByDescending<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>): Descending.
  • OrderByDescending<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>): Descending with comparer.
  • ThenBy<TSource, TKey>(IOrderedEnumerable<TSource>, Func<TSource, TKey>): Secondary ascending.
  • ThenBy<TSource, TKey>(IOrderedEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>): With comparer.
  • ThenByDescending<TSource, TKey>(IOrderedEnumerable<TSource>, Func<TSource, TKey>): Secondary descending.
  • ThenByDescending<TSource, TKey>(IOrderedEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>): With comparer.
  • Reverse<TSource>(IEnumerable<TSource>): Reverses order.

Grouping

  • GroupBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>): Groups by key.
  • GroupBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IEqualityComparer<TKey>): With comparer.
  • GroupBy<TSource, TKey, TElement>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>): With element selector.
  • GroupBy<TSource, TKey, TElement>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>, IEqualityComparer<TKey>): With comparer.
  • GroupBy<TSource, TKey, TElement, TResult>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>, Func<TKey, IEnumerable<TElement>, TResult>): With result selector.
  • GroupBy<TSource, TKey, TElement, TResult>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>, Func<TKey, IEnumerable<TElement>, TResult>, IEqualityComparer<TKey>): Full with comparer.
  • GroupedGroupBy variants with indexing (e.g., GroupBy<TSource, TKey, TElement, TResult>(IEnumerable<TSource>, Func<TSource, int, TKey>, ...)).
  • ToLookup<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>): Immediate lookup.
  • ToLookup<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IEqualityComparer<TKey>): With comparer.
  • ToLookup<TSource, TKey, TElement>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>): With element selector.

Set Operations

  • Distinct<TSource>(IEnumerable<TSource>): Unique elements.
  • Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>): With comparer.
  • Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>): Union of two sequences.
  • Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>): With comparer.
  • Intersect<TSource>(IEnumerable<TSource>, IEnumerable<TSource>): .
  • Intersect<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>): With comparer.
  • Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>): Elements in first not in second.
  • Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>): With comparer.

Joins

  • Join<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, TInner, TResult>): Inner join.
  • Join<TOuter, TInner, TKey, TResult>(..., IEqualityComparer<TKey>): With comparer.
  • GroupJoin<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, IEnumerable<TInner>, TResult>): Group join.
  • GroupJoin<...>(..., IEqualityComparer<TKey>): With comparer.

Aggregation

  • Aggregate<TSource>(IEnumerable<TSource>, TAccumulate): Custom accumulation.
  • Aggregate<TSource, TAccumulate>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate, TSource, TAccumulate>): With seed and func.
  • Aggregate<TSource, TAccumulate, TResult>(..., Func<TAccumulate, TResult>): With result selector.
  • Average<TSource>(IEnumerable<TSource>): Average of numerics (overloads for int, double, , etc.).
  • Count<TSource>(IEnumerable<TSource>): Element count.
  • Count<TSource>(IEnumerable<TSource>, Func<TSource, bool>): Count matching .
  • LongCount<TSource>(IEnumerable<TSource>): Long count.
  • LongCount<TSource>(IEnumerable<TSource>, Func<TSource, bool>): Long count with .
  • Max<TSource>(IEnumerable<TSource>): Maximum value (overloads for comparables).
  • Max<TSource>(IEnumerable<TSource>, Func<TSource, TKey>): Max by selector.
  • Min<TSource>(IEnumerable<TSource>): Minimum.
  • Min<TSource>(IEnumerable<TSource>, Func<TSource, TKey>): Min by selector.
  • Sum<TSource>(IEnumerable<TSource>): Sum of numerics (overloads).

Quantifiers

  • All<TSource>(IEnumerable<TSource>, Func<TSource, bool>): True if all match predicate.
  • Any<TSource>(IEnumerable<TSource>): True if any elements.
  • Any<TSource>(IEnumerable<TSource>, Func<TSource, bool>): Any matching predicate.
  • Contains<TSource>(IEnumerable<TSource>, TSource): Checks for element.
  • Contains<TSource>(IEnumerable<TSource>, TSource, IEqualityComparer<TSource>): With comparer.

Element Operators

  • DefaultIfEmpty<TSource>(IEnumerable<TSource>): Returns default if empty.
  • DefaultIfEmpty<TSource>(IEnumerable<TSource>, TSource): With default value.
  • ElementAt<TSource>(IEnumerable<TSource>, Index): Element at index (NET 6+).
  • ElementAt<TSource>(IEnumerable<TSource>, int): Legacy index.
  • ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index): With default if out of range (NET 6+).
  • ElementAtOrDefault<TSource>(IEnumerable<TSource>, int).
  • First<TSource>(IEnumerable<TSource>): First element.
  • First<TSource>(IEnumerable<TSource>, Func<TSource, bool>): First matching.
  • FirstOrDefault<TSource>(IEnumerable<TSource>): First or default.
  • FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource, bool>).
  • Last<TSource>(IEnumerable<TSource>): Last element.
  • Last<TSource>(IEnumerable<TSource>, Func<TSource, bool>).
  • LastOrDefault<TSource>(IEnumerable<TSource>).
  • LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource, bool>).
  • Single<TSource>(IEnumerable<TSource>): Single element.
  • Single<TSource>(IEnumerable<TSource>, Func<TSource, bool>).
  • SingleOrDefault<TSource>(IEnumerable<TSource>).
  • SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource, bool>).

Generation

  • Empty<TSource>(): Empty sequence.
  • Range(int, int): Sequence of integers from start, count.
  • Repeat<TResult>(TResult, int): Repeats element count times.

Equality

  • SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>): Checks equality.
  • SequenceEqual<TSource>(..., IEqualityComparer<TSource>): With comparer.

Concatenation

  • Concat<TSource>(IEnumerable<TSource>, IEnumerable<TSource>): Concatenates sequences.
  • Zip<TFirst, TSecond, TResult>(IEnumerable<TFirst>, IEnumerable<TSecond>, Func<TFirst, TSecond, TResult>): Pairs elements (NET 4+).
  • Zip<TFirst, TSecond, TThird, TResult>(..., Func<TFirst, TSecond, TThird, TResult>): Triple zip (NET 6+).

Conversion

  • AsEnumerable<TSource>(IEnumerable<TSource>): Casts to IEnumerable.
  • AsQueryable<TElement>(IEnumerable<TElement>): To IQueryable.
  • AsParallel<TSource>(IEnumerable<TSource>): For parallel (PLINQ).
  • [Cast<TResult>(IEnumerable)](/page/Cast): Casts to TResult.
  • OfType<TResult>(IEnumerable): Filters by type.
  • ToArray<TSource>(IEnumerable<TSource>): Materializes as array.
  • ToDictionary<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>): To dictionary.
  • ToDictionary<TSource, TKey, TElement>(..., Func<TSource, TKey>, Func<TSource, TElement>): With element selector.
  • ToDictionary<...>(..., IEqualityComparer<TKey>): With comparer.
  • ToHashSet<TSource>(IEnumerable<TSource>): To HashSet ( 4.7.1+).
  • ToHashSet<TSource>(..., IEqualityComparer<TSource>).
  • ToList<TSource>(IEnumerable<TSource>): To List.
  • ToLookup variants (as in Grouping).

Language Extensions

To support LINQ's declarative querying, C# 3.0 introduced several language extensions that enhanced , expression conciseness, and integration with the standard query operators defined in the System.Linq namespace. These features enabled developers to write readable, SQL-like queries directly in code while maintaining compile-time type safety. The [var](/page/Var) keyword provides implicit typing for local variables, allowing the to infer the type from the initializer expression. This is particularly useful in queries where the result type, such as an type or IEnumerable<T>, may be complex or generated dynamically. For instance, var query = from c in customers select c; infers query as IEnumerable<Customer>. types, created with the new { } syntax, allow on-the-fly object construction without predefined classes, ideal for query projections like new { c.Name, c.Age }. expressions, such as c => c.Age > 30, offer concise syntax for predicates and selectors, replacing verbose delegates and enabling functional-style operations on sequences. Extension methods extend existing types like IEnumerable<T> with static methods that appear as instance methods, allowing LINQ operators like Where and Select to chain fluently on any enumerable collection. Central to LINQ's usability is the query expression syntax, a declarative construct that resembles SQL and translates at compile time into chained method calls on IEnumerable<T> or IQueryable<T>. Clauses such as from (source and range variable), where (filter), select (projection), let (intermediate computation), join (equi-joins), and group (grouping) compose queries intuitively. For example, the query:
csharp
from c in customers
where c.Age > 30
select c.Name
compiles to customers.Where(c => c.Age > 30).Select(c => c.Name), leveraging lambdas and extension methods under the hood. This translation preserves the underlying functional API while providing a more approachable syntax for complex operations. Visual Basic .NET 9.0 introduced parallel extensions to support , including query expression syntax with clauses like From...In (source iteration), Where (filter), and Select (projection), enabling similar declarative patterns. For example, Dim query = From c In customers Where c.Age > 30 Select c.Name mirrors C#'s equivalent and translates to method chains. VB.NET also integrates XML literals, allowing embedded XML queries like <customers><customer><name><%= c.Name %></name></customer></customers>, which seamlessly combine with for XML manipulation. These features ensure LINQ's cross-language consistency in 3.5. While the core extensions originated in C# 3.0 and VB.NET 9.0, subsequent versions have refined integration; for instance, C# 10 and later support within lambdas used in projections, allowing more expressive operations. However, these build upon the foundational syntax without altering its fundamental translation mechanics.

LINQ Providers

In-Memory Collections (LINQ to Objects)

LINQ to Objects enables querying and manipulating data directly within .NET applications using any collection that implements the IEnumerable<T> interface, such as List<T>, arrays, or Dictionary<TKey, TValue>, without requiring an intermediate provider or translation layer. This provider operates on in-memory data sources, allowing developers to apply queries to everyday collections returned by .NET Framework methods or custom implementations. Execution is typically deferred, meaning the query is not evaluated until the results are enumerated (e.g., via foreach or conversion to a list), though immediate execution can be forced using methods like ToList() or ToArray() to materialize the results early. The capabilities of to Objects include full support for standard query operators, enabling filtering with Where, sorting via OrderBy or OrderByDescending, grouping with GroupBy, and projections using Select. These operators facilitate direct over the source collection, promoting declarative code that is more readable and maintainable than imperative loops like for or foreach. For instance, to query a list of customer sales records for the top performers, a developer might use the following C# code:
csharp
var topCustomers = customerSales
    .OrderByDescending(c => c.TotalSales)
    .Take(10)
    .ToList();
This example filters and sorts the in-memory List<CustomerSales> to retrieve the highest sales amounts, executing immediately due to ToList(). Similarly, for transforming nested arrays—such as flattening a collection of lists into a single sequence—SelectMany can be employed:
csharp
var flattenedItems = nestedLists
    .SelectMany(list => list)
    .ToArray();
These operations highlight to Objects' strength in handling hierarchical or multi-dimensional in-memory data through concise, composable queries. While powerful for small to medium datasets, LINQ to Objects has limitations, particularly its reliance on , which can lead to high memory consumption for large collections as the entire dataset must be loaded into . It does not support access to external data sources, restricting its use to scenarios where is already available locally. Deferred execution can also introduce subtle bugs if the source collection is modified between query definition and enumeration, potentially yielding inconsistent results. LINQ to Objects integrates seamlessly into various .NET workflows, such as algorithmic processing in business logic, collections of mock data, or handling deserialized objects from formats like where the data is pre-loaded into memory. This makes it ideal for or scenarios not requiring database connectivity, enhancing code expressiveness in applications like tools or parsers.

XML Manipulation (LINQ to XML)

LINQ to XML, originally developed under the project name XLINQ, provides a lightweight, object-oriented in the System.Xml.Linq namespace for working with XML data in .NET applications. It treats XML as a composable object model, primarily through classes like XDocument for entire documents and XElement for individual elements, enabling developers to parse, query, and construct XML declaratively using expressions. This functional approach contrasts with traditional XML processing by integrating seamlessly with the LINQ framework, allowing XML nodes to be queried and manipulated as sequences of objects. Key features of to XML include loading and parsing XML from files, streams, or strings into an in-memory object model, followed by querying using LINQ methods that resemble but leverage the full power of lambda expressions and standard query operators. For instance, developers can extract specific s with code like XDocument doc = XDocument.Load("file.xml"); var results = doc.Descendants("product").Where(e => (int)e.Element("price") > 100);, which filters descendant nodes based on attribute or values. XML construction is equally declarative, using methods such as new XElement("book", new XElement("title", "Example"), new XAttribute("id", 1)) to build hierarchical structures programmatically. The also supports annotations for attachment and deferred execution for efficient querying of large documents. Practical examples of to XML include extracting configuration data from app settings files, where queries can filter sections by key-value pairs; transforming feeds by selecting and reshaping feed items into custom objects; and validating XML schemas through LINQ-based checks for required elements or attribute constraints. These capabilities make it suitable for scenarios involving dynamic XML generation, such as report templating or responses. Compared to the traditional (DOM), LINQ to XML offers advantages like immutability by default for and easier navigation via intuitive LINQ chaining, reducing boilerplate code for traversal. It natively handles XML namespaces, preventing common prefix collision issues, and integrates standard query operators directly on XElement sequences for operations like filtering, sorting, and grouping. In VB.NET, language extensions further simplify usage with XML literals, allowing inline XML embedding in code. LINQ to XML has evolved significantly, with enhancements in .NET Core and later versions introducing better support for streaming large XML documents via XStreamingElement to minimize memory usage, as well as asynchronous loading methods like LoadAsync for improved performance in I/O-bound scenarios. These updates, starting from .NET Core 2.0, also include cross-platform compatibility and optimizations for high-throughput XML processing in cloud-native applications.

Relational Databases (LINQ to SQL and Entities)

LINQ to SQL, originally released in 2007 as part of the .NET Framework 3.5, serves as an object-relational mapping () provider specifically designed for SQL Server databases. It enables developers to map schemas to object models using attributes such as [Table] for tables and [Column] for columns, or through the Object Relational Designer (O/R Designer) in . Queries written in LINQ syntax against these mapped objects are translated into T-SQL statements by the LINQ to SQL provider, which executes them on the SQL Server and materializes the results back into .NET objects. Key features of to SQL include deferred execution, where queries are not executed until enumerated (e.g., via ToList()), allowing for composition and optimization before hitting the database. It also provides automatic change tracking through the DataContext, which monitors modifications to attached entities and generates appropriate INSERT, UPDATE, or DELETE T-SQL commands upon submission. For performance reuse, compiled queries can be created to cache the plan, reducing overhead for repeated executions with varying parameters. An example of query is a LINQ join operation, such as from c in Customers join o in Orders on c.CustomerID equals o.CustomerID select new { c, o }, which generates an equivalent T-SQL INNER JOIN to fetch related data efficiently. LINQ to Entities, integrated into the (EF), offers a more flexible and extensible ORM approach for relational databases, supporting multiple providers beyond just SQL Server. Introduced with Entity Framework 1.0 (.NET Framework 3.5 SP1) in 2008 and evolving through EF6 (released in 2013), it allows model creation via code-first (defining classes that map to tables) or model-first (using the EDMX designer) workflows. It supports complex types for value objects without identities and navigation properties for defining relationships, such as one-to-many associations between entities like and . Like LINQ to SQL, it leverages deferred execution for LINQ queries, translates them to provider-specific SQL (e.g., T-SQL for SQL Server), and includes change tracking via the DbContext for entity updates. Compiled queries are available for reuse, and navigation via LINQ syntax, such as blog.Posts.Where(p => p.Title.Contains("LINQ")), generates optimized JOINs in the underlying SQL. The evolution of these providers reflects a shift toward broader compatibility and performance. LINQ to SQL, while functional, saw limited updates after .NET Framework 4.0 in 2010 and is no longer actively developed, with Microsoft recommending Entity Framework as the successor for new development. LINQ to Entities advanced significantly with EF Core's release in June 2016 as a cross-platform, open-source rewrite, introducing support for code-first migrations and optimizations in later versions. EF Core 9.0 (November 2024) and beyond include enhancements such as expanded LINQ support for Azure Cosmos DB (including primitive collections, new operators like Count and Sum, and functions like DateTime.Year), complex type support for GroupBy and ExecuteUpdate, improved query translations (e.g., GREATEST/LEAST, inlined subqueries), and performance optimizations like table/projection pruning and Native AOT support, alongside .NET 9's runtime improvements for faster query compilation and execution. Despite these capabilities, both providers can encounter limitations, notably the N+1 query problem, where accessing navigation properties triggers individual queries per entity (e.g., one initial query plus one per related item), leading to performance degradation without explicit eager loading via . Optimization techniques, such as projecting only needed fields or using split queries in , mitigate this, but improper use can result in inefficient database roundtrips.

Legacy Data Integration (LINQ to DataSet)

LINQ to DataSet enables developers to apply syntax to data stored in objects, facilitating the manipulation of tabular, disconnected data within the .NET Framework. This provider extends the functionality of and classes by introducing extension methods, such as AsEnumerable(), which converts a DataTable's rows into an IEnumerable collection. This allows standard LINQ operators—like Where, Select, and OrderBy—to treat DataRow instances as strongly typed objects, enabling queries directly in C# or code without resorting to string-based SQL or manual iteration. Key features of to DataSet include the ability to perform cross-table queries, such as inner joins and group joins across multiple DataTables within a , preserving the relational structure of the data. For instance, developers can join tables on common keys, like SalesOrderID, to combine related records from sales headers and details. Aggregations are supported through standard operators (e.g., , ) and DataSet-specific extensions, particularly when working with typed that infer types from XML schemas. Unlike database-centric providers, LINQ to DataSet generates no SQL; all operations occur in-memory after the data has been loaded into the , making it suitable for cached or offline scenarios. Practical examples illustrate its utility in processing pre-loaded data. For filtering loaded database results, a query might load orders via a SqlDataAdapter into a and then apply to select high-value orders:
csharp
[DataSet](/page/Data_set) dataSet = new [DataSet](/page/Data_set)();
sqlDataAdapter.Fill(dataSet, "Orders"); // Load from database
var highValueOrders = from row in dataSet.Tables["Orders"].AsEnumerable()
                      where row.Field<decimal>("Total") > 1000
                      select row;
This approach also supports merging data from multiple DataReader instances without reloading from the database, by populating separate tables and querying them jointly. In legacy applications, such as those built with , to DataSet serves as a migration bridge, integrating seamlessly with existing components like SqlDataAdapter to fill s from SQL Server or other sources, thus modernizing data handling in older codebases. Despite its conveniences, to DataSet has notable drawbacks, primarily stemming from its in-memory nature: it requires loading entire datasets into memory before querying, which can lead to high resource consumption for large volumes of data and reduced efficiency compared to providers that translate queries directly to SQL. As a result, it has been largely phased out in favor of more advanced object-relational mappers like for new development, though it remains fully supported in the .NET Framework for maintaining legacy systems.

Performance Considerations

Optimization Techniques

LINQ queries leverage deferred execution by default, where the query expression is not evaluated until it is enumerated, such as through a foreach loop or methods like ToList() that force iteration. This approach enhances performance by postponing computation until necessary and allowing optimizations like query composition, but developers must avoid multiple enumerations of the same deferred query to prevent redundant executions. To trigger immediate execution when needed, such as for materializing results early, use operators like ToList(), ToArray(), or Count(), which evaluate the query once and store the results in memory. For reusable IQueryable scenarios, particularly with database providers, the CompiledQuery.Compile method in LINQ to Entities and LINQ to SQL compiles queries into delegates, caching the expression tree translation to eliminate repeated compilation overhead on subsequent invocations. In Core, equivalent functionality is provided through EF.CompileQuery and EF.CompileAsyncQuery, which precompile LINQ expressions for hot paths, reducing CPU time for complex queries by avoiding runtime parsing and optimization. Additional techniques include ensuring proper indexing on database columns used in Where or Join clauses within providers like EF Core, as unindexed queries can lead to full table scans. Preferring Select projections to retrieve only required fields—rather than loading entire entities—minimizes data transfer over the network and reduces in-memory object graph construction. Provider-specific optimizations further enhance efficiency; for relational databases via LINQ to SQL or EF Core, SQL projections translate Select statements directly to SELECT clauses, fetching scalar values or types instead of full entities to cut down on and costs. EF Core additionally performs expression tree simplification during query compilation, rewriting complex expressions to eliminate redundant operations and generate more concise SQL before execution. Tools like facilitate query testing and optimization by allowing interactive execution against various providers, with built-in result visualization and performance profiling to iterate on expressions rapidly. Visual Studio's LINQ debugging tools, including expression evaluation during breakpoints, aid in inspecting query behavior without full application runs. In to Objects, reducing allocations involves favoring streaming operators like Where and Select over buffering ones like ToList unless materialization is required, as streaming processes elements lazily to minimize temporary collections and garbage collection pressure. .NET 9 introduced significant performance improvements, including up to 75% faster execution for chained operations like Where and Select through optimized iterators and reduced allocations. For large datasets, (PLINQ) can serve as an optimization by distributing computations across threads, though it introduces coordination overhead best suited for operations.

Common Pitfalls and Benchmarks

One common pitfall in LINQ usage arises from improper joins, which can inadvertently produce Cartesian products—resulting in exponentially larger result sets than intended—when join conditions are omitted or incorrectly specified in queries against relational data sources like . For instance, a query joining two collections without a proper key match might cross-multiply rows, leading to memory exhaustion or incorrect aggregations in large datasets. Another frequent issue involves closure problems in lambda expressions, particularly when lambdas capture variables in foreach or for s, causing all iterations to reference the same final value due to deferred execution in queries. This "access to modified " warning from the highlights how the lambda closes over the 's mutable , often resulting in duplicated or incorrect results when the query is enumerated later. To mitigate this, developers must introduce local variables within the to capture fresh copies for each iteration. Over-fetching data in database queries represents a third major pitfall, where expressions like Include() or broad projections load unnecessary related entities, consuming excessive memory and potentially causing out-of-memory () exceptions when processing large result sets, such as millions of records. In scenarios, this often stems from eager loading without selectivity, amplifying network and heap usage. Benchmarks reveal that to Objects operations, such as simple filtering on collections, incur some overhead compared to equivalent imperative loops due to allocations and delegate invocations, though this is typically minor (around 20% or less in recent benchmarks). .NET 9 optimizations have improved this further. Similarly, Core queries in recent .NET versions (as of .NET 9) exhibit approximately 10-20% runtime overhead versus raw SQL executions for common CRUD operations, primarily from query translation and materialization steps, though this gap narrows with optimized projections. In real-world case studies involving large-scale applications, grouping operations on datasets exceeding 100,000 records via to Objects or EF Core have shown slowdowns compared to hand-optimized loops or indexed SQL, exacerbated by intermediate collection buffering and lack of streaming. .NET 9 optimizations have improved , but it can still lag behind implementations for very large datasets due to allocation overhead. Tools like BenchmarkDotNet, applied to .NET 9 environments, quantify these issues, highlighting allocation bottlenecks in grouping keys. To address these pitfalls, profiling tools such as can identify hot paths in execution, revealing allocation spikes from closures or over-fetching for targeted refactoring. In EF Core read-only scenarios, applying AsNoTracking() disables change tracking to reduce by approximately 40%, preventing in fetch-heavy queries without sacrificing query expressiveness. For parallel cases, brief integration with PLINQ can mitigate sequential bottlenecks, though it requires careful avoidance of shared state to prevent thread-safety issues.

Parallel and Advanced Features

Parallel LINQ (PLINQ)

Parallel LINQ (PLINQ) was introduced in .NET Framework 4.0 as a parallel execution engine for queries, enabling developers to leverage multi-core processors for processing in-memory data sources such as IEnumerable<T> collections. It achieves this by extending the standard query operators with parallel versions, allowing sequential queries to be transformed into parallel ones with minimal changes to the code. To initiate parallel execution, a developer calls the AsParallel() on an IEnumerable<T>, which returns a ParallelQuery<T> that PLINQ processes across multiple threads. Key features of PLINQ include automatic data partitioning and load balancing, where the query data source is divided into segments assigned to worker threads, with dynamic adjustments to balance computational load across available cores. For operations involving side effects, such as updating shared data structures, PLINQ provides the ForAll operator, which applies an action to each element in parallel without requiring result merging back to the main thread; for instance, it can be used to add query results to a concurrent collection like ConcurrentBag<T>. Cancellation support is integrated through ParallelOptions, allowing queries to be interrupted via a CancellationToken passed with the WithCancellation method, which propagates the token to delegate executions. Additionally, developers can control the degree of parallelism using WithDegreeOfParallelism on ParallelOptions to specify the maximum number of threads, such as limiting to two for targeted resource management. A practical example of PLINQ in action is parallel aggregation on large datasets, such as computing the sum of filtered customer orders from an array. The query customers.AsParallel().Where(c => c.Orders.Count > 10).Sum(c => c.TotalSales) partitions the customers array, filters in parallel, and aggregates the totals across threads before combining results, significantly speeding up processing for compute-intensive operations on multi-core systems. Another example involves generating and filtering even numbers from a range: var evenNums = from num in Enumerable.Range(1, 10000).AsParallel() where num % 2 == 0 select num;, which executes the Where clause across threads and counts 5000 even numbers efficiently. Under the hood, PLINQ's execution model is built on the Task Parallel Library (TPL), where it analyzes the query structure at runtime to determine if parallelization is beneficial; if so, it schedules tasks for partitioning, execution, and merging, falling back to sequential execution otherwise to avoid unnecessary overhead. To preserve the original order of elements in the output—crucial for certain queries—developers can chain AsOrdered() after AsParallel(), though this incurs additional buffering and sorting costs that may reduce parallelism gains. Despite its capabilities, PLINQ has limitations: not all LINQ operators parallelize effectively, particularly those with stateful operations or dependencies that hinder independent thread execution, potentially leading to sequential fallback or performance degradation. Furthermore, the overhead of partitioning, thread management, and result merging makes PLINQ unsuitable for small datasets or queries with low computational intensity, where sequential often performs better.

Modern Extensions in Recent .NET Versions

Since the release of .NET 6 in 2021, has received several enhancements to its standard query operators, primarily through new extension methods in the System.Linq namespace that improve expressiveness for common tasks. The Chunk method divides a sequence into contiguous subgroups of a specified size, facilitating without manual indexing. Similarly, MinBy and MaxBy retrieve the element with the minimum or maximum key value according to a selector function, avoiding the need for a full sort or to retrieve the argument minimum or maximum. Additionally, the Zip operator gained overloads supporting three or more sequences, allowing pairwise combination of elements from multiple sources into tuples or custom results via a result selector. In .NET 9, released in November 2024, further operators were introduced to streamline grouping and aggregation without intermediate collections. The CountBy computes the frequency of each key extracted from elements, returning an enumerable of key-value pairs where values represent counts, which is useful for quick histograms or frequency analysis. Complementing this, AggregateBy performs custom aggregation over elements grouped by key, accumulating state per key with an initial value and update function. Another addition is the Index , which projects each element alongside its zero-based position, enabling positional access in a functional style similar to Select((item, index) => ...). .NET 10, released on November 11, 2025, builds on these with comprehensive support for asynchronous through the System.Linq.AsyncEnumerable class, providing a full set of extension methods for IAsyncEnumerable<T> to enable LINQ patterns over asynchronous streams without custom implementations. This includes async versions of standard operators, facilitating efficient querying of sources like network responses or file reads. Additionally, EF 10 introduces native support for LeftJoin and RightJoin LINQ operators, simplifying outer join queries by translating them directly to SQL LEFT JOIN and RIGHT JOIN without complex GroupJoin + DefaultIfEmpty patterns. It also enhances parameterized collection translation in LINQ queries for better database performance, using scalar parameters to optimize query plans. LINQ's integration with has evolved in recent versions, with EF 8 (2023) and later providing improved translation of spatial queries using NetTopologySuite types, such as distance calculations and geometric intersections directly in LINQ expressions. capabilities in Select and other projectors have been enhanced through C# language features like switch expressions, allowing more concise deconstruction and conditional projections within queries. For instance, the Chunk operator can batch video frame data for : frames.Chunk(10).AsParallel().ForEach(batch => ProcessBatch(batch));, leveraging PLINQ for concurrency. In analytics scenarios, CountBy simplifies metrics, such as sales.CountBy(item => item.Category) to generate category counts without explicit grouping. All these extensions maintain by implementing them as opt-in extension methods on IEnumerable<T>, ensuring existing code remains unaffected while allowing seamless adoption in new projects. and other language features further enhance by providing immutable types for query results, improving on traditional anonymous types.

Implementations and Ports

Native .NET Implementations

Language Integrated Query (LINQ) was first introduced as a core feature in the .NET Framework version 3.5, providing full support for query operations in desktop and server applications primarily targeted at Windows environments. This implementation included built-in providers such as to SQL, which enabled direct querying of SQL Server databases from within .NET code but remained tied to Windows-specific dependencies for optimal performance. Subsequent versions of the .NET Framework, up to 4.8, maintained and expanded LINQ's integration, ensuring compatibility with Windows desktop and server workloads while incorporating enhancements like improved expression tree handling. With the evolution to .NET Core starting from version 1.0 and unifying into .NET 5 and later, gained full cross-platform capabilities, supporting development and deployment on , macOS, and Windows. This shift optimized for cloud-native scenarios, particularly through integration with , where it facilitates efficient data querying in web applications across diverse hosting environments. Entity Framework Core (EF Core) emerged as the primary database provider in this era, replacing LINQ to SQL and offering cross-platform ORM functionality with as its , enabling seamless data access in modern .NET applications. As of 2025, .NET 9 fully incorporates across all supported tiers, including cloud (), desktop (/WPF), and mobile (via .NET MAUI), with ongoing performance optimizations such as up to 10x faster execution for common operators like Take and DefaultIfEmpty. Additionally, .NET 9 introduces enhanced Ahead-of-Time (AOT) compilation support for operators, particularly in EF Core, allowing precompilation of queries to native code for faster startup times and reduced runtime overhead in resource-constrained environments like mobile and cloud edge deployments. Variations within the native .NET ecosystem include the Mono project, an open-source implementation that provides support compatible with .NET Framework standards for cross-platform applications outside Microsoft's direct control. In game development, Unity's engine offers partial implementation through its C# scripting support, enabling query operations on collections but with limitations in performance-critical paths due to IL2CPP compilation and Burst compiler constraints, often requiring custom extensions for full efficiency. Microsoft maintains ongoing support for LINQ across all .NET versions, delivering regular security patches and non-security updates as part of its official support policy, with .NET 9 receiving monthly servicing releases including fixes as recent as October 2025.

Cross-Language and Third-Party Ports

F# provides native support for through its query expressions, which enable declarative querying of data sources using a syntax that translates to method calls on IEnumerable<T> or IQueryable<T>. This feature integrates seamlessly with the .NET ecosystem, allowing F# developers to leverage providers for objects, XML, and databases without additional extensions. Visual Basic .NET offers full LINQ integration, extending query syntax directly into the language for working with collections, SQL databases, XML, and ADO.NET datasets. Key language features such as implicitly typed variables, anonymous types, and lambda expressions support LINQ operations, enabling concise and type-safe queries. In , LINQ is supported in C# scripts by importing the System.Linq namespace, allowing developers to perform filtering, , and grouping on collections like lists and arrays within game development contexts. However, compatibility can vary with Unity's scripting backend, such as potential issues with Ahead-of-Time (AOT) on , requiring careful use or alternatives like UniLinq for certain platforms. Java's Stream API, introduced in Java 8, provides functional-style operations for querying and transforming collections, offering capabilities similar to LINQ's standard query operators like filtering (filter), mapping (map), and reducing (reduce). QueryDSL complements this by enabling type-safe, fluent queries for JPA, SQL, and other backends, with a syntax inspired by LINQ for constructing domain-specific queries without string concatenation. The LINQ.js library implements .NET's functionality in , providing extension methods for arrays to support operations such as Where, Select, GroupBy, and OrderBy in a chainable, deferred-execution manner. For , py-linq ports LINQ's querying syntax to handle collections of objects, allowing developers to write queries using familiar operators like select and where on iterables. LINQPad serves as a development tool for interactively testing and debugging LINQ queries across various data sources, including databases and in-memory objects, without requiring a full application build. NHibernate's QueryOver offers a type-safe, lambda-based querying alternative to the Criteria API, with that resembles LINQ for building complex queries against relational databases in scenarios. LINQBridge is an open-source reimplementation of to Objects for .NET Framework 2.0, enabling C# 3.0 syntax and extension methods on older runtimes before official .NET 3.5 support. Ports of .NET to mobile platforms via , now evolved into .NET MAUI, retain full capabilities, allowing cross-platform apps on and to use query expressions with Entity Framework Core for local data access like . Community-driven efforts include experimental implementations in , such as the Linq-in-Rust project, which uses declarative macros to provide query syntax for collections akin to .NET's , though still under active development. For , .NET's runtime supports directly, enabling browser-based applications to execute queries on client-side data using standard .NET syntax compiled to WASM.

Influences and Predecessors

Conceptual Foundations

The conceptual foundations of Language Integrated Query (LINQ) are rooted in functional programming paradigms, particularly the use of list comprehensions and higher-order functions prevalent in languages like Haskell and ML. List comprehensions provide a concise, declarative syntax for transforming and filtering collections, which directly inspired LINQ's query expression syntax to enable similar readability and expressiveness over arbitrary data sources. Higher-order functions such as map and filter, which operate on collections by applying functions to each element, formed the basis for LINQ's standard query operators, allowing developers to compose queries functionally without imperative loops. This integration of functional concepts into an object-oriented language like C# aimed to bridge the gap between in-memory data manipulation and more complex querying needs. LINQ's design also draws heavily from database paradigms, adopting the declarative style of SQL and the operators of to treat queries as composable expressions rather than procedural code. In SQL, the SELECT-FROM-WHERE structure specifies what data to retrieve without detailing how, a pattern LINQ generalizes to work with objects, XML, or databases through a unified syntax. 's foundational operators—such as selection, projection, and join—underpin LINQ's ability to perform set-based operations on sequences, extending these mathematical primitives beyond tabular data to arbitrary collections. This approach ensures that queries remain declarative and optimizable, much like how database engines rewrite SQL for efficiency. Earlier technologies contributed to LINQ's evolution, including XLANG for defining workflows and ObjectSpaces, an early .NET project announced in 2003 for object-relational mapping. XLANG, introduced with BizTalk Server 2000, provided a declarative XML-based for orchestrating processes, influencing LINQ's emphasis on composable, domain-specific expressions for non-procedural logic. ObjectSpaces laid groundwork for LINQ's type-safe data access but was canceled and superseded by LINQ's more flexible architecture. Key contributions from Erik Meijer's research on query comprehensions, along with demonstrations of LINQ at the 2005 Professional Developers Conference (PDC), solidified LINQ's theoretical underpinnings, with expression trees enabling the representation of queries as manipulable data structures. Meijer's work emphasized monads as a unifying for comprehensions, allowing LINQ to compile queries into efficient code across domains. The PDC announcement highlighted LINQ's innovations, including the role of expression trees in enabling runtime query analysis and translation, such as to SQL. Overall, LINQ's design goals centered on unifying querying syntax across in-memory objects, databases, and XML, inspired by efforts toward type-safe SQL variants to eliminate impedance mismatch between programming languages and data stores. LINQ represents a declarative query paradigm integrated directly into the C# and Visual Basic .NET languages, contrasting with imperative alternatives prevalent in pre-LINQ .NET development, such as traditional loops and foreach statements. Imperative approaches, like using for loops to filter and transform collections, often require more verbose code to achieve the same results as LINQ's query expressions, leading to increased boilerplate and potential for errors in manual iteration logic. While imperative loops can offer a performance edge in simple scenarios due to LINQ's slight overhead from deferred execution and iterator patterns, LINQ's expressiveness promotes cleaner, more maintainable code through composable operators like Where and Select. In the realm of object-relational mapping (ORM), , particularly through , provides a type-safe, integrated querying mechanism that surpasses the expressiveness of competitors like the Hibernate Criteria in . The Hibernate Criteria enables programmatic, object-oriented query construction to avoid string-based HQL, but it lacks the deep language integration and compile-time IntelliSense of , resulting in less fluid composition within code. Similarly, within .NET, micro-ORMS like prioritize raw SQL execution for superior performance—such as faster SELECT operations with lower memory allocation—over 's full-featured abstraction, trading 's declarative fluency for direct control and reduced overhead in high-throughput scenarios. Modern query paradigms, such as for interactions, diverge from by emphasizing client-specified data fetching through a schema-defined , rather than embedding queries within the host . queries, written in a dedicated syntax like { user(id: 1) { name } }, allow precise response shaping to minimize over-fetching, but require separate tooling and resolvers, unlike 's seamless integration into .NET code for unified data manipulation across sources. Domain-specific languages (DSLs) like for graph databases further illustrate this separation, as uses a declarative pattern-matching syntax tailored for graph traversals (e.g., MATCH (n:Person)-[:KNOWS]->(m) RETURN n), demanding learning a distinct outside the primary programming , in contrast to 's extensible . Emerging trends extend LINQ-like capabilities to non-relational environments, including databases via the .NET driver, which translates LINQ expressions into aggregation pipelines for querying document collections. This enables familiar syntax, such as collection.Where(d => d.Age > 18), to operate on documents without custom query languages, bridging relational paradigms with flexible schemas. In , Rx.NET builds on LINQ by applying query operators to asynchronous streams via IObservable, shifting from pull-based IEnumerable queries to push-based event handling for real-time data flows, such as continuous filtering of live events. Evaluations of highlight its compile-time type safety as a key differentiator from dynamic SQL, where string concatenation risks injection vulnerabilities and lacks IntelliSense or schema validation until runtime. 's expression trees ensure queries are verified against data models during compilation, reducing errors compared to ad-hoc SQL strings, while its composability—chaining operations like GroupBy followed by OrderBy—offers greater flexibility than rigid stored procedures, which require separate invocation and limit in-language reuse.

References

  1. [1]
    LINQ overview - .NET - Microsoft Learn
    Language-Integrated Query (LINQ) provides language-level querying capabilities, and a higher-order function API to C# and Visual Basic
  2. [2]
    Language Integrated Query (LINQ) - C# | Microsoft Learn
    Language-Integrated Query (LINQ) is the name for a set of technologies based on the integration of query capabilities directly into the C# language.Write LINQ queries · Query expression basics · Introduction to LINQ Queries - C
  3. [3]
    The history of C# | Microsoft Learn
    This C# version's killer feature was the query expression, also known as Language-Integrated Query (LINQ). A more nuanced view examines expression trees ...What's new in C# 11 · Relationships between... · Local functions
  4. [4]
    Language-Integrated Query (LINQ) - Visual Basic - Microsoft Learn
    Sep 10, 2022 · LINQ is a set of features that extends powerful query capabilities to the language syntax of Visual Basic. LINQ introduces standard ...
  5. [5]
    The Evolution Of LINQ And Its Impact On The Design Of C#
    In simple terms, LINQ is a series of language extensions that supports data querying in a type-safe way; it will be released with the next version Visual ...
  6. [6]
    Intro to LINQ - Visual Basic - Microsoft Learn
    Language-Integrated Query (LINQ) adds query capabilities to Visual Basic and provides simple and powerful capabilities when you work with all kinds of data.
  7. [7]
    LINQ, take two – Realizing the LINQ to Everything dream
    May 10, 2011 · At PDC a few years back, we introduced the LINQ project to solve the impedance mismatch between various data models by means of integrated query ...
  8. [8]
    Flexible Data Access With LINQ To SQL And The Entity Framework
    LINQ to SQL and the ADO.NET Entity Framework represent a quantum leap forward in the ORM space and go a long way toward reducing the impedance mismatch between ...
  9. [9]
    Introduction to LINQ Queries - C# | Microsoft Learn
    LINQ offers a consistent model for queries on data across various kinds of data sources and formats. In a LINQ query, you're always working with objects.
  10. [10]
    Overview - LINQ to XML - .NET - Microsoft Learn
    Sep 15, 2021 · Professional developers can use LINQ to XML to greatly increase their productivity. With LINQ to XML, they can write less code that's more ...
  11. [11]
    Parallel LINQ: Running Queries On Multi-Core Processors
    PLINQ is a query execution engine that accepts any LINQ-to-Objects or LINQ-to-XML query and automatically utilizes multiple processors or cores for execution ...<|control11|><|separator|>
  12. [12]
    [PDF] Festschrift - Microsoft
    In 2004, the Cω proposal was merged with Anders Hejlsberg's C# sequence operator project. The joint project became known as. Language Integrated Queries ...Missing: Erik | Show results with:Erik<|control11|><|separator|>
  13. [13]
    [PDF] A History of Haskell: Being Lazy With Class - Microsoft
    Apr 16, 2007 · Erik Meijer, a principal designer of LINQ, says that LINQ is directly inspired by the monad comprehensions in. Haskell. 4. On April 1, 2002, ...
  14. [14]
    LINQ: reconciling object, relations and XML in the .NET framework
    LINQ: reconciling object, relations and XML in the .NET framework. Authors: Erik Meijer.Missing: motivations | Show results with:motivations<|control11|><|separator|>
  15. [15]
    Erik Meijer on LINQ - InfoQ
    Mar 4, 2009 · Erik Meijer is the creator of LINQ at MS, where he works together with the Microsoft Visual C# and the Microsoft Visual Basic language design ...Missing: origins history
  16. [16]
    LINQ - CODE Magazine
    Feb 1, 2006 · At PDC 2005, Microsoft introduced brand new technology known as LINQ, which stands for “Language Integrated Query.”The feature-set hiding ...
  17. [17]
    LINQ for Visual C# 2008 - O'Reilly
    Visual Studio 2008 provides functionality to support LINQ application development. The compiler is upgraded to support LINQ query syntax, and IntelliSense ...
  18. [18]
    Microsoft .NET Framework - Microsoft Lifecycle
    Releases ;.NET Framework 4.0, Apr 12, 2010, Jan 12, 2016 ;.NET Framework 3.5 Service Pack 1, Nov 19, 2007, Jan 9, 2029 ;.NET Framework 3.0, Nov 21, 2006, Jul 12 ...
  19. [19]
    Introduction to PLINQ - .NET - Microsoft Learn
    PLINQ is a parallel implementation of the Language-Integrated Query (LINQ) pattern. PLINQ implements the full set of LINQ standard query operators as extension ...What is a Parallel query? · The ParallelEnumerable Class
  20. [20]
    NET and .NET Core official support policy
    Out of support versions ;.NET 6, November 8, 2021, 6.0.36, November 12, 2024, November 12, 2024 ;.NET 5, November 10, 2020, 5.0.17, May 10, 2022, May 10, 2022.
  21. [21]
    Announcing .NET 5.0 - Microsoft Developer Blogs
    Nov 10, 2020 · We introduced . NET 5.0 way back in May 2019, and even set the November 2020 release date at that time. From that post: “we will ship . NET ...
  22. [22]
    What's New in EF Core 8 | Microsoft Learn
    One nice feature of SqlQuery is that it returns an IQueryable which can be composed on using LINQ. For example, a 'Where' clause can be added to the query above ...Value objects using Complex... · Primitive collections
  23. [23]
    What's new in .NET 9 - Microsoft Learn
    NET 9 also includes new tensor types that expand AI capabilities. ... NET 9 brings support for new themes, enhancements for asynchronous development, and more:.
  24. [24]
    Standard Query Operators Overview - C# | Microsoft Learn
    Aug 20, 2025 · Language-Integrated Query (LINQ) isn't only about retrieving data. It's also a powerful tool for transforming data. By using a LINQ query ...
  25. [25]
    Expression Trees - C# | Microsoft Learn
    Expression trees represent code in a tree-like data structure, where each node is an expression, for example, a method call or a binary operation such as x < y.Missing: 2006 PDC
  26. [26]
  27. [27]
  28. [28]
  29. [29]
  30. [30]
  31. [31]
  32. [32]
    Pattern matching overview - C# - Microsoft Learn
    Pattern matching is a technique where you test an expression to determine if it has certain characteristics. C# pattern matching provides more concise ...
  33. [33]
    LINQ to Objects - Visual Basic - Microsoft Learn
    Sep 15, 2021 · LINQ to Objects refers to the use of LINQ queries with any IEnumerable or IEnumerable<T> collection directly, without the use of an intermediate LINQ provider ...
  34. [34]
    LINQ to SQL - ADO.NET - Microsoft Learn
    Sep 15, 2021 · In LINQ to SQL, the data model of a relational database is mapped to an object model expressed in the programming language of the developer.
  35. [35]
    Map LINQ to SQL classes to tables/views (O-R Designer)
    Aug 30, 2024 · To map LINQ to SQL classes, drag tables or views from Server/Database Explorer onto the O/R Designer. This creates entity classes with 1:1  ...
  36. [36]
    LINQ to SQL Queries - ADO.NET - Microsoft Learn
    LINQ to SQL queries use the same syntax as LINQ, but objects are mapped to database elements. It translates queries to SQL and sends them to the server.
  37. [37]
    DataContext Class (System.Data.Linq) - Microsoft Learn
    DataContext is the main entry point for LINQ to SQL, tracking changes to entities and maintaining an identity cache. It is the source of all entities.Missing: deferred | Show results with:deferred
  38. [38]
    Compiled Queries (LINQ to Entities) - ADO.NET - Microsoft Learn
    Nov 6, 2021 · Compiled queries in LINQ to Entities increase performance by compiling queries once and executing them multiple times with different parameters ...
  39. [39]
    Past Releases of Entity Framework - EF6 - Microsoft Learn
    Oct 14, 2020 · Here is the list of past releases, in reverse chronological order, with information on the new features that were introduced in each release.
  40. [40]
    Relationship navigations - EF Core | Microsoft Learn
    Mar 30, 2023 · Navigations are layered over foreign keys to provide a natural, object-oriented view for reading and manipulating relationships.
  41. [41]
    Owned Entity Types - EF Core - Microsoft Learn
    Mar 30, 2023 · EF Core allows you to model entity types that can only ever appear on navigation properties of other entity types. These are called owned entity types.Missing: LINQ | Show results with:LINQ
  42. [42]
    Compare EF6 and EF Core | Microsoft Learn
    Dec 14, 2022 · EF6 is a stable, supported product, but is no longer being actively developed. Feature comparison. EF Core offers new features that won't be ...
  43. [43]
    Efficient Querying - EF Core - Microsoft Learn
    Jan 12, 2023 · This section details some common themes for making your queries faster, and pitfalls users typically encounter.Efficient Updating · Pagination · Performance Diagnosis
  44. [44]
    Single vs. Split Queries - EF Core | Microsoft Learn
    Jan 25, 2024 · This page describes these performance issues, and shows an alternative way to load related entities which works around them.Cartesian Explosion · Data Duplication · Split Queries
  45. [45]
    LINQ to DataSet Overview - ADO.NET - Microsoft Learn
    Sep 15, 2021 · LINQ to DataSet makes it easier and faster to query over data cached in a DataSet object. These queries are expressed in the programming language itself.
  46. [46]
    LINQ to DataSet - ADO.NET - Microsoft Learn
    Sep 15, 2021 · LINQ to DataSet simplifies querying by enabling developers to write queries from the programming language itself, instead of by using a separate query language.
  47. [47]
    Cross-Table Queries (LINQ to DataSet) - ADO.NET | Microsoft Learn
    Sep 15, 2021 · In addition to querying a single table, you can also perform cross-table queries in LINQ to DataSet. This is done by using a join.Missing: documentation | Show results with:documentation<|control11|><|separator|>
  48. [48]
    LINQ to DataSet Examples - ADO.NET
    ### Summary of LINQ to DataSet Examples
  49. [49]
    Querying DataSets (LINQ to DataSet) - ADO.NET | Microsoft Learn
    Sep 15, 2021 · You can create LINQ to DataSet queries in two different forms: query expression syntax and method-based query syntax.
  50. [50]
    Deferred execution and lazy evaluation - LINQ to XML - .NET
    Deferred execution can greatly improve performance when you have to manipulate large data collections, especially in programs that contain a series of chained ...Missing: key | Show results with:key
  51. [51]
    Classification of Standard Query Operators by Manner of Execution
    Sep 15, 2021 · The LINQ to Objects implementations of the standard query operator methods execute in one of two main ways: immediate or deferred.
  52. [52]
    Advanced Performance Topics - EF Core - Microsoft Learn
    Jan 15, 2025 · EF supports compiled queries, which allow the explicit compilation of a LINQ query into a .NET delegate. Once this delegate is acquired, it can ...Dbcontext Pooling · Dynamically-Constructed... · Compiled ModelsMissing: NoSQL | Show results with:NoSQL
  53. [53]
    New features in Entity Framework Core 3.x - EF Core - Microsoft Learn
    Jan 30, 2023 · LINQ enables you to write database queries using your .NET language of choice, taking advantage of rich type information to offer ...Linq Overhaul · C# 8.0 Support · Nullable Reference Types
  54. [54]
    LINQPad - The .NET Programmer's Playground
    With LINQPad, you can interactively query databases directly in LINQ (as well as SQL). The big win with LINQ is having association properties automatically ...Download LINQPad · Purchase Premium Features · Lprun · LINQPad FAQMissing: assisted | Show results with:assisted<|control11|><|separator|>
  55. [55]
    LINQ to SQL tools in Visual Studio - Microsoft Learn
    Dec 4, 2024 · Explore LINQ to SQL tools in Visual Studio for object-relational mapping, including the Object Relational Designer (O/R Designer).
  56. [56]
    Fluent Nhibernate generating incorrect query resulting in Cartesian ...
    Mar 18, 2018 · Fluent Nhibernate generating incorrect query resulting in Cartesian product instead of single row · Ask Question. Asked 7 years, 6 months ago.LINQ to entity, wrong join type - asp.net mvc - Stack OverflowC# LINQ INNER JOIN is returning wrong count - Stack OverflowMore results from stackoverflow.com
  57. [57]
    How to Avoid Common Errors with Subqueries and Joins in SQL
    Apr 13, 2023 · Another common error when using subqueries and joins is creating a Cartesian product. ... Cartesian products or incorrect results. …see more. Like.<|separator|>
  58. [58]
    Avoiding Cartesian Products by Fixing Broken JOINs in SQL
    Aug 20, 2025 · A join tells the database how rows from one table should connect to rows from another, but if that instruction is missing or incorrect, the ...
  59. [59]
    Closing over the loop variable considered harmful, part one
    Nov 12, 2009 · In C# 5, the loop variable of a foreach will be logically inside the loop, and therefore closures will close over a fresh copy of the variable each time.
  60. [60]
    c# - Closure and Linq - Stack Overflow
    Dec 5, 2021 · To avoid this problem you should capture loop index into temporary variable withing the loop scope like this.Should I be concerned about "access to modified closure" in a linq ...c# - lambda functions have strange behaviors in loops, how to fix?More results from stackoverflow.com
  61. [61]
    Captured Variables : Understanding lambda expression and ...
    Jan 2, 2024 · Closures ensure that the lambda expressions have access to the current state of the variables in their surrounding scope. Example: Below, I'm ...
  62. [62]
    Entity framework large data set, out of memory exception
    Aug 11, 2013 · I am working the a very large data set, roughly 2 million records. I have the code below but get an out of memory exception after it has process around three ...c# - How to avoid memory overflow when querying large datasets ...Entity Framework is Too Slow. What are my options? - Stack OverflowMore results from stackoverflow.com
  63. [63]
    Using LINQ when performance counts | by Thomas Woltjer | Medium
    Jan 29, 2023 · Every LINQ query comes with a heap allocation. Of course, there is the simple fact that a heap allocation must be performed to store the lambda ...Every Linq Query Comes With... · Get Thomas Woltjer's Stories... · How To Ensure Linq Queries...
  64. [64]
    Optimising .NET code: Let's blame LINQ - Endjin
    Sep 6, 2023 · In this series we're looking at ways to improve the performance and memory efficiency of our .NET code, using my solutions to Advent of Code ...Missing: productivity reduction
  65. [65]
    What is the performance overhead of Entity Framework compared to ...
    Mar 6, 2014 · In general, yes EF is slower than raw SQL because it's difficult to predict how EF will build up a query and EF has no knowledge of your database indexes or ...How to speed up EF Core query when it comes to a large database ...Entity Framework Include performance - Stack OverflowMore results from stackoverflow.com
  66. [66]
    Dapper vs. EF Core: Performance Showdown in 2025
    Sep 6, 2025 · Single Record Updates: Dapper executes updates faster, averaging 169.2 microseconds, compared to EF Core's 209.1 microseconds. Additionally, EF ...
  67. [67]
    How to optimize Linq query with large number of records?
    Dec 12, 2022 · You basically group data by AlarmName + AssetNumber, filter our alarms with severity level Unknown then run business function on grouped batches.
  68. [68]
    .NET 9.0 LINQ Performance Improvements - NDepend Blog
    Nov 19, 2024 · NET 9.0 brings significant improvements to LINQ performance, with some scenarios showing remarkable gains. Let's take a closer look at what's driving these ...Missing: productivity reduction
  69. [69]
    NET 9 LINQ Performance Improvements | by sharmila subbiah
    Oct 8, 2024 · Benchmark comparisons between .NET 8 and .NET 9 show that certain LINQ queries execute up to 30% faster, depending on the dataset and query complexity.
  70. [70]
    8 Tips and Tricks for Writing the Best Queries in LINQ to Entities
    Dec 10, 2024 · LINQ is a powerful querying tool for .NET applications. There are certain techniques to follow when writing queries to make sure they run quickly and ...
  71. [71]
    From LINQ to Performance: Tricks That Made My Queries 10x Faster
    Sep 26, 2025 · How I tuned my LINQ queries and avoided common pitfalls that slowed my apps down ... AsNoTracking() cut memory usage by almost half in one ...7. Using Any() Instead Of... · 9. Profiling Queries With... · Lazy Initialization In C#...<|control11|><|separator|>
  72. [72]
    Potential pitfalls with PLINQ - .NET | Microsoft Learn
    Sep 15, 2021 · In this article · Don't assume that parallel is always faster · Avoid writing to shared memory locations · Avoid over-parallelization · Avoid calls ...
  73. [73]
  74. [74]
  75. [75]
  76. [76]
    Parallel Aggregations in PLINQ - .NET Blog
    Jan 21, 2008 · For example, Thread 1 could compute the sum of squares of {1,4} and Thread 2 would compute the sum of squares of {3,2}*.
  77. [77]
    Task Parallel Library (TPL) - .NET - Microsoft Learn
    Parallel LINQ (PLINQ), Describes how to achieve data parallelism with LINQ queries. Parallel Programming, Top-level node for .NET parallel programming. See ...Introduction to PLINQ · Data Parallelism · Task-based asynchronous... · Dataflow<|control11|><|separator|>
  78. [78]
  79. [79]
  80. [80]
  81. [81]
  82. [82]
  83. [83]
  84. [84]
    What's new in .NET libraries for .NET 9 | Microsoft Learn
    Nov 11, 2024 · LINQ. New methods CountBy and AggregateBy have been introduced. These methods make it possible to aggregate state by key without needing to ...
  85. [85]
    Enumerable.CountBy<TSource,TKey> Method (System.Linq)
    Returns the count of elements in the source sequence grouped by key.
  86. [86]
  87. [87]
  88. [88]
    Spatial Data - EF Core | Microsoft Learn
    Mar 22, 2023 · EF Core enables mapping to spatial data types in the database by using NTS types in your model. To enable mapping to spatial types via NTS, call ...
  89. [89]
    What's new in C# 11 - Microsoft Learn
    Mar 15, 2024 · This feature was first available in Visual Studio 2022 version 17.2 as a preview feature, and in .NET 7 Preview 2. Raw string literals. Raw ...<|control11|><|separator|>
  90. [90]
    Introduction to LINQ (Visual Basic) | Microsoft Learn
    Sep 15, 2021 · LINQ makes a query a first-class language construct in Visual Basic. You write queries against strongly typed collections of objects by using language keywords ...
  91. [91]
    Microsoft .NET Framework 3.5 Service Pack 1
    Jul 15, 2024 · NET Framework-based clients can use LINQ to query data services and a simple .NET Framework object layer to update data in the service.
  92. [92]
    NET Framework & Windows OS versions - Microsoft Learn
    This article describes the key features of .NET Framework by version, provides information about the underlying CLR versions and associated development ...
  93. [93]
    Working with LINQ - C# | Microsoft Learn
    Sep 15, 2021 · This tutorial teaches you how to generate sequences with LINQ, write methods for use in LINQ queries, and distinguish between eager and lazy ...Missing: key | Show results with:key
  94. [94]
    C# and LINQ for Data Access with EF Core - Microsoft Learn
    Aug 9, 2022 · In this session, learn how EF Core simplifies working with a cross-platform SQLite database in a .NET MAUI app and handles everything from complex queries to ...Missing: 5+
  95. [95]
    NativeAOT Support and Precompiled Queries (Experimental)
    Apr 23, 2025 · NativeAOT allows faster startup by precompiling LINQ queries, generating C# interceptors with finalized SQL, but dynamic queries are not ...Publishing An Ef Nativeaot... · Limitations · Dynamic Queries Are Not...
  96. [96]
    Home | Mono
    Cross platform, open source .NET framework. Mono is a software platform designed to allow developers to easily create cross platform applications.The Mono Runtime · Download · Documentation · CommunityMissing: LINQ | Show results with:LINQ
  97. [97]
    .NET 9.0 Update - October 14, 2025 (KB5068332) - Microsoft Support
    Oct 14, 2025 · .NET 9.0 has been refreshed with the latest update as of October 14, 2025. This update contains security and non-security fixes. See the release ...
  98. [98]
    Query Expressions - F# - Microsoft Learn
    Query expressions enable you to query a data source and put the data in a desired form. Query expressions provide support for LINQ in F#.Syntax · Remarks
  99. [99]
    Visual Basic Features That Support LINQ - Microsoft Learn
    Sep 15, 2021 · The name Language-Integrated Query (LINQ) refers to technology in Visual Basic that supports query syntax and other language constructs ...
  100. [100]
    Is C# LINQ fully reliable/supported? - Unity Discussions
    Jan 13, 2016 · Don't use the default LINQ if you plan to publish an iOS build. Methods like OrderBy and alike may produce AOT/JIT errors. Use UniLinq ...
  101. [101]
    Java and .NET – Comparing Streams to LINQ - IO Digital
    Both LINQ and streams are ways to simplify querying datasets and to provide developers with an easy API to use. Streams are similar to LINQ in many ways, but ...
  102. [102]
    Querydsl Reference Guide
    Jan-Willem Gmelig Meyling · 1. Maven integration · 2.1. · 2. Ant integration · 2.1. · 3. Using Querydsl JPA in Roo · 2.1. · 4. Generating the model from hbm.xml ...Missing: LINQ inspiration
  103. [103]
    mihaifm/linq: linq.js - LINQ for JavaScript - GitHub
    A JavaScript implementation of the .NET LINQ library. It contains all the original .NET methods plus a few additions. Written in pure JavaScript with no ...
  104. [104]
    py-linq - PyPI
    py-linq ports LINQ, a .NET querying language, to Python, allowing developers to query collections of objects using the same syntax.
  105. [105]
    Chapter 17. QueryOver Queries - NHibernate
    Note: QueryOver is intended to remove the references to 'magic strings' from the ICriteria API while maintaining it's opaqueness. It is not a LINQ provider; ...
  106. [106]
    LINQBridge - Google Code
    With Visual Studio's multi-targeting and LINQBridge, you'll be able to write local (LINQ to Objects) queries using the full power of the C# 3.0 compiler—and yet ...
  107. [107]
    StardustDL/Linq-in-Rust: Language Integrated Query in Rust. - GitHub
    Language Integrated Query in Rust (created by declarative macros). This project is under development! API might be changed.Linq In Rust · Usage · Methods
  108. [108]
    [PDF] Comprehensive Comprehensions - Microsoft
    Jun 18, 2007 · Kleisli, Links, and LINQ provide comprehensions as a flexible way to query databases, com- piling as much of the comprehension as possible into ...
  109. [109]
    The World According to LINQ - ACM Queue
    Aug 30, 2011 · Erik Meijer (emeijer@microsoft.com) has been working on "Democratizing the Cloud" for the past 15 years. He is perhaps best known for his ...Missing: history | Show results with:history
  110. [110]
    XLANG-s Language - BizTalk Server | Microsoft Learn
    Feb 1, 2021 · XLANG/s defines a rich set of high-level constructs that are used to define business processes. While XLANG/s provides support for low-level ...Missing: workflows | Show results with:workflows
  111. [111]
    Cure Data Type 'Impedance Mismatch' With LINQ
    Sep 1, 2005 · The LINQ Project is the new Orcas feature that's most interesting to me because it implements the former ObjectSpaces in a much more elegant way ...
  112. [112]
  113. [113]
  114. [114]
  115. [115]
    Introduction to GraphQL | GraphQL
    ### GraphQL Query Paradigm Summary
  116. [116]
    Introduction - Cypher Manual
    ### Summary of Cypher DSL for Neo4j
  117. [117]
    MongoDB C# Driver - C#/.NET Driver - MongoDB Docs
    ### Summary on LINQ Support in MongoDB .NET Driver
  118. [118]
    dotnet/reactive: The Reactive Extensions for .NET - GitHub
    Rx defines all the standard LINQ operators available for other providers, but it also adds numerous additional operators. For example, it defines Scan , which ...