Имеет больше смысла спрашивать о конкретном аспекте LINQ. Это немного похоже на выяснение, "Как Windows работает" иначе.
ключевые роли LINQ для меня с точки зрения C#:
Лямбда-выражения. Это выражения как это:
x => x * 2
(int x, int y) => x * y
() => { Console.WriteLine("Block"); Console.WriteLine("Lambda"); }
Лямбда-выражения преобразовываются или в [1 114] делегаты или деревья выражений .
Анонимные типы. Это выражения как это:
new { X=10, Y=20 }
Они все еще со статическим контролем типов, это - просто компилятор, генерирует неизменный тип для Вас со свойствами X
и Y
. Они обычно используются с var
, который позволяет типу локальной переменной быть выведенным из своего выражения инициализации.
выражения Запроса. Это выражения как это:
from person in people
where person.Age < 18
select person.Name
Они переводятся компилятором C# в "нормальный" C# 3.0 (т.е. форма, которая не использует выражения запроса). Разрешение перегрузки и т.д. применяется впоследствии, который является абсолютно ключевым для способности использовать тот же синтаксис запроса с несколькими типами данных без компилятора, имеющего любое знание типов, такими как Queryable. Вышеупомянутое выражение было бы переведено в:
people.Where(person => person.Age < 18)
.Select(person => person.Name)
Дополнительные методы. Это статические методы, которые могут использоваться, как будто они были методами экземпляра типа первого параметра. Например, дополнительный метод как это:
public static int CountAsciiDigits(this string text)
{
return text.Count(letter => letter >= '0' && letter <= '9');
}
может тогда использоваться как это:
string foo = "123abc456";
int count = foo.CountAsciiDigits();
Примечание, что реализация CountAsciiDigits
использование другой дополнительный метод, Enumerable.Count()
.
Это - большинство соответствующих язык аспекты. Тогда существуют реализации стандартных операторов запроса в поставщиках LINQ, таких как LINQ к Объектам и LINQ к SQL и т.д. У меня есть представление о том, как довольно просто реализовать LINQ к Объектам - это находится на "Переговоры" страница C# подробно веб-сайт.
путь поставщики, такие как LINQ к работе SQL обычно через Queryable
класс. В их ядре они переводят деревья выражений в другие форматы запроса и затем создают соответствующие объекты с результатами выполнения тех запросов из процесса.
, который покрывает все, которое Вы интересовались? Если существует что-нибудь в особенности, что Вы все еще хотите знать о, просто отредактировать Ваш вопрос, и я буду делать попытку.
Решение состоит в том, чтобы добавить некоторые импорты
import javax.sql.DataSource
import groovy.sql.Sql
import org.codehaus.groovy.grails.commons.ConfigurationHolder
и следующий код:
def _url = ConfigurationHolder.config.dataSource.url
def _username = ConfigurationHolder.config.dataSource.username
def _password = ConfigurationHolder.config.dataSource.password
def _driver = ConfigurationHolder.config.dataSource.driverClassName
def sql = Sql.newInstance(_url, _username, _password, _driver)
def query = "<your SQL query>"
sql.eachRow(query){
println "ID: " + it.id // Whatever you need
}
Разве вы не можете сделать следующее? (при условии, что dataSource является переменной в области видимости)
def sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", dataSource.username, dataSource.password, dataSource.driverClassName)