Groovy: Как получить доступ к значениям, уже установленным в DataSource

Имеет больше смысла спрашивать о конкретном аспекте LINQ. Это немного похоже на выяснение, "Как Windows работает" иначе.

ключевые роли LINQ для меня с точки зрения C#:

  • Деревья выражений. Это представления кода как данные. Например, дерево выражений могло представить понятие, "берут строковый параметр, называют свойство Length на нем и возвращают результат". То, что они существуют как [1 113] данные , а не как скомпилированный код, означает, что поставщики LINQ, такие как LINQ к SQL могут проанализировать их и преобразовать их в SQL.
  • Лямбда-выражения. Это выражения как это:

    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 класс. В их ядре они переводят деревья выражений в другие форматы запроса и затем создают соответствующие объекты с результатами выполнения тех запросов из процесса.

, который покрывает все, которое Вы интересовались? Если существует что-нибудь в особенности, что Вы все еще хотите знать о, просто отредактировать Ваш вопрос, и я буду делать попытку.

6
задан Luixv 21 September 2009 в 16:12
поделиться

3 ответа

Решение состоит в том, чтобы добавить некоторые импорты

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
}
10
ответ дан 9 December 2019 в 22:37
поделиться

Вы можете создать класс Sql по источнику данных,

1
ответ дан 9 December 2019 в 22:37
поделиться

Разве вы не можете сделать следующее? (при условии, что dataSource является переменной в области видимости)

def sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", dataSource.username, dataSource.password, dataSource.driverClassName)
0
ответ дан 9 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: