Практическое руководство. Вызов канонических функций
Класс EntityFunctions содержит методы, предоставляющие доступ к каноническим функциям для использования в запросах LINQ to Entities. Сведения о канонических функциях см. в разделе Канонические функции.
Примечание.
Методы AsUnicode и AsNonUnicode в классе EntityFunctions не имеют эквивалентных канонических функций.
Канонические функции, которые производят вычисление по ряду значений и возвращают одиночное значение (известные также как статистические канонические функции), могут вызываться напрямую. Другие канонические функции могут вызываться только в составе запроса LINQ to Entities. Чтобы вызвать агрегатную функцию напрямую, ей необходимо передать экземпляр ObjectQuery<T>. Дополнительные сведения см. в приведенном ниже втором примере.
Некоторые канонические функции можно вызвать с помощью методов среды CLR в запросах LINQ to Entities. Список методов СРЕДЫ CLR, сопоставленных с каноническими функциями, см. в разделе "Метод CLR" с каноническим сопоставлением функций.
Пример 1
В следующем примере используется модель AdventureWorks Sales. В этом примере выполняется запрос LINQ to Entities, в котором используется метод DiffDays для возврата всех продуктов, для которых разница между датами SellEndDate
и SellStartDate
меньше 365 суток:
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
var products = from p in AWEntities.Products
where EntityFunctions.DiffDays(p.SellEndDate, p.SellStartDate) < 365
select p;
foreach (var product in products)
{
Console.WriteLine(product.ProductID);
}
}
Using AWEntities As New AdventureWorksEntities()
Dim products = From p In AWEntities.Products _
Where EntityFunctions.DiffDays(p.SellEndDate, p.SellStartDate) < 365 _
Select p
For Each product In products
Console.WriteLine(product.ProductID)
Next
End Using
Пример 2
В следующем примере используется модель AdventureWorks Sales. В этом примере напрямую вызывается статистическая функция StandardDeviation для возврата стандартного отклонения промежуточных итогов SalesOrderHeader
. Обратите внимание, что в функцию передается экземпляр ObjectQuery<T>, что позволяет вызывать ее, хотя она и не входит в состав запроса LINQ to Entities.
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
double? stdDev = EntityFunctions.StandardDeviation(
from o in AWEntities.SalesOrderHeaders
select o.SubTotal);
Console.WriteLine(stdDev);
}
Using AWEntities As New AdventureWorksEntities()
Dim stdDev As Double? = EntityFunctions.StandardDeviation( _
From o In AWEntities.SalesOrderHeaders _
Select o.SubTotal)
Console.WriteLine(stdDev)
End Using