Использование выражения запроса против модулей Seq?

Есть ли какие-либо преимущества в использовании выражения запроса по сравнению с модулями Sequence при манипулировании данными, полученными через FSharp.Data.SqlClient?

Например:

query{
    for row in SelectAllCategories.Execute() do
    where row.Id = 1
    select {
        Id = row.Id;
        Category = row.CategoryName
    }
}

против

SelectAllCategories.Execute()
|> Seq.filter (fun x -> x.Id = 1)
|> Seq.map (fun x ->
                {
                   Id = x.Id;
                   Category = x.CategoryName
                }

В этом отношении вы можете даже рассмотреть LINQ. Так каковы преимущества, если таковые имеются, особенно в отношении FSharp.Data.SqlClient?

2 ответа

Решение

В этом конкретном случае FSharp.Data.SqlClient обеспечивает по умолчанию IEnumerable<ProvidedType>.Record тип результата, а не IQueryable<ProvidedType> любого рода. Все взаимодействия с механизмом SQL непрозрачны для выражения запроса и заключены в SqlCommandProvider.Execute() метод. Таким образом, любые потенциальные выгоды query {...} использование Linq-to-Sql здесь не используется.

Следовательно, я не удивлюсь, что случай с функциями из Seq Модуль даст лучшую производительность при меньших затратах, чем базовый механизм desugared, связанный с выражениями запросов. Нет преимуществ использования выражения запроса здесь.

Конструктор запросов предоставляет способ построения IQueryables в F#, Seq функции модуля работают на IEnumerables (тот seq тип является псевдонимом для). Это общие интерфейсы.NET, а не F#, и различия между ними хорошо описаны, например, здесь.

Кроме того, кроме Seq Функции модуля у вас также есть seq строитель:

seq {
   for row in SelectAllCategories.Execute() do 
       if row.Id = 1 then 
           yield { Id = row.Id; Category = row.CategoryName }
}

Это примерно эквивалентно использованию Seq Функции модуля, так что выбор одного над другим в основном зависит от стиля или удобства.

Другие вопросы по тегам