Использование выражения запроса против модулей 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
Функции модуля, так что выбор одного над другим в основном зависит от стиля или удобства.