LINQ поддерживает два поведения выполнения: отложенное выполнение и немедленное выполнение. Отложенное выполнение означает, что оценка выражения задерживается до тех пор, пока его фактическое значение фактически не требуется. Это значительно повышает производительность, избегая ненужного выполнения.
Отложенное выполнение применимо к любой коллекции в памяти, а также к удаленным поставщикам LINQ, таким как LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML и т. Д.
В представленном рассматриваемом примере кажется, что запрос выполнен на where
, но на самом деле этого не происходит. Запрос выполняется при вызове .FirstAsync()
. Это означает, что вам действительно нужны данные, а C # выполняет запрос, извлекает данные и сохраняет данные в памяти.
Если вы хотите немедленного поведения при выполнении, вы можете использовать .ToList()
, он извлечет все спроецированные данные и сохранит их в памяти.
var result =(from tkn in Db.Set()
where tkn.IsActive == true
& tkn.Token == token
select tkn.RelatedObjectMappedToTableB).ToList();
Подробнее см. в статье
.
Когда PowerShell видит маркер Return-True
, он идентифицирует его как команду и до оценки или конца оператора, все остальное - аргумент, который передается функции Return-True
.
Вы видите это в действии, если Вы делаете:
PS > function Return-True { "The arguments are: $args"; return $true }
PS > Return-True -eq $false
The arguments are: -eq False
True
Вот почему все следующее возвращает 'True', потому что все, что Вы видите, является результатом вызова Return-True
с различными аргументами:
PS > Return-True -eq $false
True
PS > Return-True -ne $false
True
PS > Return-True -eq $true
True
PS > Return-True -ne $true
True
Используя (Return-True)
силы PowerShell для оценки функции (без аргументов).
Вторая строка не делает булевой оценки. Посмотрите на то, что происходит, если Вы делаете то же самое со строками.
PS C:\> function Return-True { return "True string" }
PS C:\> Return-True
True string
PS C:\> Return-True -eq "False string"
True string
PS C:\> (Return-True) -eq "False string"
False
вторая строка просто возвращает значение функции и не делает сравнение. Я не уверен точно, почему это поведение происходит, но оно делает поведение легче видеть чем тогда, когда с помощью булевых значений, которые преобразовываются в строки, "Верные" и "Ложные".
Если вы используете PowerShell V2 редактор, вы бы увидели, что -eq в первом примере синего цвета, потому что это аргумент и -eq во втором примере серого цвета, потому что это оператор
Также в V2 вы можете строго относиться к аргументам с помощью CmdletBinding и param
function Return-True
{
[CmdletBinding()]
param()
return $true
}
Return-True -eq $false
Return-True -eq $false
Return-True : A parameter cannot be found that matches parameter name 'eq'.
At line:7 char:16
+ Return-True -eq <<<< $false
+ CategoryInfo : InvalidArgument: (:) [Return-True], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Return-True